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