2015-03-18 182 views
0

我做了一個非常簡單的程序,分發變更(宿舍,硬幣,鎳和便士)給用戶。它分發相同的金額,價值,用戶輸入現金的變化。它表現良好,直到我輸入:0.59 因此,修改了一下程序後,我能解決這個問題。不過,我還是不明白,究竟是什麼我做得對解決它......瞭解類型鑄造

INT change_owed(浮動量) {

int change, coins; 
change = coins = 0; 

change = (float)(amount * 1000000.0); 
change /= 10000; 

任何解釋將是巨大的。另外,如果這個問題已經被問到,我很抱歉。在搜索stackoverflow時,我找不到解決方案。

+0

我們需要比這更多的代碼,什麼類型的變化和數量? – Joshpbarron 2015-03-18 22:25:49

+1

在此代碼示例中,演員陣容可能不會執行任何操作,但此處的背景可能有所幫助:http://stackoverflow.com/questions/2100490/floating-point-inaccuracy-examples – Douglas 2015-03-18 22:51:44

+1

change是一個整數,而amount是一個整數浮動。 – 2015-03-18 23:10:35

回答

2

問題是0.01沒有確切的表示形式作爲浮點數,因此計算更改時會出現舍入誤差。理想的解決方案是完全避免使用浮點數。改用定點算法。

作爲一個例子,您可以使用整數值345來代替像3.45這樣的浮點數來代表三美元和四十五美分。這種表示法稱爲定點,因爲在倒數第二位之前有一個假定的小數點。

下面的示例程序顯示了一種讀取美元數量(如3.45)作爲固定點數字的方法。

int main(void) 
{ 
    int dollars, cents, count, amount; 

    printf("Enter amount: "); 
    fflush(stdout); 
    count = scanf("%d.%d", &dollars, &cents); 

    if (count == 1) 
     amount = dollars * 100; 
    else if (count == 2 && cents < 100) 
     amount = dollars * 100 + cents; 
    else 
     amount = 0; 

    printf("%d\n", amount); 
} 
+0

我真的很感激反饋,user3386109。 – 2015-03-19 02:34:14

+0

@Liftalots很高興幫助,祝你好運! – user3386109 2015-03-19 02:39:55