2016-09-24 72 views
2

現在我正在使用C,並且在執行特定任務時遇到了問題。 該任務是能夠輸入一個數字和硬幣的價值將被顯示後。我的問題是,假設有0.10美分的變化,我的代碼將跳過錢圈(它檢查0.10的值是否小於變化的值,然後減去)並繼續到鎳..然後在變化值變爲0.05並且變成硬幣後跳過鎳,然後硬幣停在0.01,並且結束硬幣計數,使得計數變短並且比所需時間還長。當float值相等時,如何讓for循環繼續執行?

int main(void) { 
    float c; 

    int k = 0; 

    printf("How much change?: \n"); 
    c = GetFloat(); 

    //checks for quarters 
    for (float q = 0.25; q <= c; k = k + 1) { 

    c = c - 0.25; 
    printf("q \n"); 
    } 
    //checks for dimes 
    for (float d = 0.10; d <= c; k = k + 1) { 

    c = c - 0.10; 
    printf("d \n"); 
    } 
    //checks for nickels 
    for (float n = 0.05; n <= c; k = k + 1) { 
    c = c - 0.05; 
    printf("n \n"); 

    } 
    //checks for pennies 
    for (float p = 0.01; p <= c; k = k + 1) { 
    c = c - 0.01; 
    printf("p \n"); 
    } 

    printf("%d & %.02f \n", k, c); 
} 

我有一個線索,認爲該錯誤可能是在for循環的條件部分,但我不知道:/

+1

可能重複的[浮點數學是否被破壞?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – Olaf

+0

如果人們只是在閱讀信息頁**之前* *詢問... – Olaf

+0

在所有基於C的語言中是否都是這樣的? (C++,c#,java) – shinzou

回答

6

你的問題都是由於浮點不精確:二進制浮點不能被精確地轉換爲十進制符號並從十進制符號轉換

它恰好可以用浮點數表示0.25:正如它的許多倍數一樣。但是0.1不能。所以你增加這些數額會給你意想不到的行爲。

在這種情況下,您最好的選擇是使用整數類型並以分爲單位工作。