2015-11-04 4 views
-2

Я написал этот код:Код неправильный или? в C

float suma; 
int centy; 
int cele; 
printf("Zadaj sumu a ja ti ju napisem a zaroven aj vysklonujem:\n"); 
scanf("%f",&suma); 
cele=(int)suma; 
centy= (suma-cele)*100; 

switch ((int)suma) { 
    case 1: 
     printf("%d euro",(int)suma); 
     break; 
    case 2 ... 4: 
     printf("%d eura",(int)suma); 
     break; 

    default: 
     printf("%d eur",(int)suma); 
     break; 

} 
switch (centy) { 
    case 1: 
     printf(" a %d cent\n",centy); 
     break; 
    case 2 ... 4: 
     printf(" a %d centy\n",centy); 
     break; 

    default: 
     printf(" a %d centov\n",centy); 
     break; 
} 

Но когда я печатаю 5.56 он будет говорить, что я набрал 5,55 в консоли. Как вы думаете. Что я должен изменить? Я новичок ...

+7

http://stackoverflow.com/q/588004/3185968 – EOF

+0

Все правильно, кроме вашего ожидания :) –

+0

Вы ожидаете, что 'suma-cele' будет 0.56, но это может быть 0.5599999999999999. –

ответ

1

Вы должны исправить ошибки округления при использовании чисел с плавающей запятой. Легкий способ, который часто работает, состоит в том, чтобы добавить 0.5 перед преобразованием в int. Так, что-то, как это должно работать лучше:

centy= (int) (0.5 + suma * 100.0) - cele * 100; 

Это, вероятно, лучше, чтобы прочитать входные данные как строки и разобрать его в евро и центах, используя «» как разделитель. Но это позволит легко работать с кодом. Добавление 0.5 часто работает, когда вам не нужна точная точность, но достаточно близко.

+0

Спасибо человек. Он работает – RA3SK

+0

№ При использовании валют или других точных значений никогда не используйте плавающие точки. Вместо этого используйте целые числа с фиксированной запятой (например, вычисляют в центах или их долю). – Olaf

+0

Согласен. Вероятно, лучше прочитать ввод как строку и проанализировать его в евро и центах, используя «.». как разделитель, но я хотел легко работать с его кодом. Добавление 0.5 часто работает, когда вам не нужна точная точность, но достаточно близко. – bruceg

Смежные вопросы