2015-11-04 92 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

你必须纠正使用浮点数时舍入错误。经常工作的简单方法是在转换为int之前添加0.5。所以,这样的事情应该更好的工作:

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

它可能更好地读取输入的字符串,并将其解析为欧元和分用“”作为分隔符。但是这会让代码轻松工作。当你不需要精确的精确度时,加0.5常常有效,但足够接近就可以。

+0

谢谢你。它的工作原理 – RA3SK

+0

不。在处理货币或其他精确值时,请勿使用浮点数。改用定点整数(例如以美分或其一部分计算)。 – Olaf

+0

我同意。将输入作为字符串读取并使用'。'解析为欧元和美分可能会更好。作为分隔符,但我想让他的代码轻松工作。当你不需要精确的精确度时,加0.5常常有效,但足够接近就可以。 – bruceg