2012-10-29 41 views
1

我不明白爲什麼這對90%的輸入有效,但不是其他。它的意思是告訴你多少硬幣你會得到改變。大多數測試金額工作正常,但如果你輸入4.20(或$ 4.20),它返回23個硬幣......它應該是18個硬幣(16個季度和2個鎳幣)。錯誤在哪裏?這是我的代碼:我短C代碼中的小錯誤。爲什麼?

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

int main(void){ 

    float change = 0.00; 

    printf("How much change is owed? "); 
    change = GetFloat(); 

    float quarters = change/.25; 
    change-= (int)quarters*.25; 

    float dimes = change/.10; 
    change-= (int)dimes*.10; 

    float nickels = change/.05; 
    change-= (int)nickels*.05; 

    float pennies = (change+.005)/.01; 
    change-=(int)pennies*.01; 

    int total = (int)quarters+(int)dimes+(int)nickels+(int)pennies; 

    printf("%d\n", total); 

    return 0; 
    } 
+7

你永遠不應該使用浮點數來表示在首位的錢。 – 2012-10-29 19:51:39

+0

由於一切都是1美分的倍數,爲什麼不把所有東西都存儲爲整數美分?您將以這種方式避免所有浮點相關的麻煩。 –

+0

這是一個家庭作業,應該教浮法功能,這是它寫的方式是唯一的原因。大多數輸入工作正常,只有某些數字沒有。我不能用不同的課程或其他課程來重寫它,因爲這是教授想要看到的。 –

回答

2

拋出浮點計算。這一切都基於百分之幾,所以只需使用整數除法/模數。 從來沒有依靠浮點數完美的準確性。

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

int main(void){ 

    float fchange = 0.00; 
    int change = 0; 

    printf("How much change is owed? "); 
    fchange = GetFloat(); 

    change = (int)roundf(fchange*100.0); 

    int quarters = change/25; 
    change = change % 25; 

    int dimes = change/10; 
    change = change % 10; 

    int nickels = change/5; 
    change = change % 5; 

    printf("%d quarters, %d dimes, %d nickels, %d pennies\n", quarters, dimes, nickels, change); 

    return 0; 
} 
+0

'change =(int)(fchange * 100.0);'< - 您需要舍入,截斷導致某些輸入的結果錯誤(例如4.20)。 –

+0

@DanielFischer謝謝丹尼爾。我完全在回答一個不同的問題時,我沒有完成它(phat手指)。 – WhozCraig

+0

多任務處理?我希望我能做到這一點。 –

6

最接近float4.20比略小(4.19999980926513671875,對於通常的32位IEEE754 float多個)。所以在你從16個季度減去4美元之後,剩下的數量略小於0.2。除以0.1得到一個略小於2的值,所以你的nickels的值爲1.同樣的情況發生在你扣除鎳之後,該值略小於0.1,除以0.05導致商數略小於2。

您應該使用整數僅用於這樣的計算,以美分計算。

+0

在Objective-C中,'NSDecimalNumber'類也是一個選項,但它會更麻煩。 – Tommy

+0

對於確切的IEEE值。你是用手還是從網站上計算出來的? –

+0

我讓我的Haskell解釋器計算出'fromRational'將有理數轉換爲最接近的可表示的浮點數。 –

1

其他答案主要包括:你應該在這裏使用固定點,而不是浮點數。儘管如此,從浮點輸入到固定點表示時,要小心圓整。下面是一個簡短的版本我砍死了,它應該爲所有積極投入工作:

#include <stdlib.h> 
#include <stdio.h> 
int main(int argc, char ** argv) 
{ 
    float change = atof(argv[1]); 
    int work = (int)(100*change+0.5); 
    int quarters, dimes, nickels, pennies; 
    quarters = work/25; work %= 25; 
    dimes = work/10; work %= 10; 
    nickels = work/5; work %= 5; 
    pennies = work; 
    printf("%.2f dollars = %d quarters, %d dimes, %d nickels and %d pennies: %d coins total\n", 
    change, quarters, dimes, nickels, pennies, quarters+dimes+nickels+pennies); 
    return 0; 
} 

例如:

./change 4.20 
4.20 dollars = 16 quarters, 2 dimes, 0 nickels and 0 pennies: 18 coins total