簡體   English   中英

計算程序中的更改-浮點錯誤

[英]Calculating change in a program - Floating point error

我一直在開發一個程序來計算更改,並且該程序永遠不會最終運行並在完成后終止。 我不知道我的代碼有什么問題。 如果有人可以幫助,那就太好了。

private static void calculateChange(double price, double given) {
    int ones = 0, quarters = 0, dimes = 0, nickels = 0, pennies = 0;
    double change = given - price;
    while (change != 0) {
        if (change >= 1) {
            change = change - 1;
            ones++;
        }
        if (change >= .25) {
            change = change - 0.25;
            quarters++;
        }
        if (change >= .10) {
            change = change - .10;
            dimes++;
        }
        if (change >= .05) {
            change = change - .05;
            nickels++;
        }
        if (change >= .01) {
            change = change - .01;
            pennies++;
        }
    }
    System.out.println();
    System.out.println("Correct Change");
    System.out.println("Ones " + ones);
    System.out.println("Quarters  " + quarters);
    System.out.println("Dimes " + dimes);
    System.out.println("Nickels " + nickels);
    System.out.println("Pennies " + pennies);

}

double類型是浮點數 ,浮點數以精度為代價。 在某些時候,當您從change中減去美分時,它變得小於0.01但大於零, 或者小於零。

在這兩種情況下,所有if條件都將為false,而while條件仍然成立,從而導致無限循環。

一個快速的解決方案是將while條件從change != 0 change >= 0.01

更好的解決方案是使用整數類型(例如int )並將其存儲為美分(因此,美元將是100)。 這種方法不會有任何浮點數錯誤。

像0.1、0.05或0.01這樣的數字不能完全表示為二進制浮點數。 因此,您的change可能永遠不會為零。

除了使用整數或BCD之外,還可以在檢查零時允許公差,例如

while (Math.abs(change) < 0.000001) {
    ...
}

也許這是一個浮點問題。 您的雙精度“變化”永遠不會精確地等於整數零,因此您的“ while”測試將始終如一。 嘗試按照while(change> = epsilon)的方式做一些事情

另外...嘗試使用if-if-if鏈...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM