2016-12-07 28 views
-4

當輸入4.2時,無法計算出我的代碼中的錯誤,因爲更改將是420,而是出現爲419.我的代碼中出現了什麼問題?爲什麼100 * 4.2以419而不是420出來?

#include<stdio.h> 
#include<cs50.h> 

int evaluate(int change){ 

    int quarter,dime,nickel,penny; 
    int coins = 0; 

    quarter = change/25; 
    change = change%25; 
    printf("quarters:%d\n" ,quarter); 
    printf("change left: %d\n",change); 
    dime = change/10; 
    change = change%10; 

    printf("dimes:%d\n" ,dime); 
    printf("change left: %d\n",change); 
    nickel = change/5; 
    change = change%5; 

    printf("nickels:%d\n" ,nickel); 
    printf("change left: %d\n",change); 
    penny = change; 
    coins = quarter+dime+nickel+penny; 

    printf("pennies:%d\n" ,penny); 
    printf("change left: %d\n",change); 
    return coins; 
} 


int main() 
{ 
    printf("How much:"); 
    float input = GetFloat(); 
    int coin = 0; 

    while(true) 
    { 
     if(input>0) 
     { 
      int change = (100*input); 
       printf("change: %d\n",change); 

      coin = evaluate(change); 

      printf("%d\n",coin); 
      return 0; 
     }  

     else 
     { 
      printf("are you serious? retry:"); 
      input = GetFloat(); 
    } } 
} 

該方案是評估收銀員必須給客戶的硬幣最少數量。問題是,在獲得輸入4.2時,輸出出錯了;也是change=100*input出來是419輸入是4.2。請幫我弄清楚問題。

Code on left side and output on right.

+4

_尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證的示例._ –

+0

而不是發佈鏈接到圖像,請在此處發佈您的代碼。 – Yousaf

+0

將您的代碼發佈爲代碼,而不是圖片。你想得到幫助的人不會浪費時間回答這個問題。 –

回答

2

4.2不能與你的平臺上使用的二進制浮點格式明確地表達。當你乘以100時,它給出的數字略小於420。將其轉換爲整數產生419

int n = round(number); 

或通過添加一個舍入調整:

int n = (int)(number + 0.5); 

不要使用float此計算,使用正確的圓形

您可以通過給轉換前四捨五入數量防止這種在這個答案中解釋的美分數量:Integer overflow in greedy coin counting

相關問題