计算程序中的变化 - 浮点错误

时间:2017-03-04 17:06:39

标签: java eclipse methods

我一直致力于制作一个程序来计算变化,程序永远不会运行并在完成后终止。我不知道我的代码有什么问题。如果有人能帮助那就好了。

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);

}

3 个答案:

答案 0 :(得分:3)

double类型为floating point,浮点数表示性能的精确度。在某些时候,当您从change减去美分时,它会小于0.01但大于零,它会小于零。

在其中任何一种情况下,您的所有if条件都将为false,但while条件仍为true,从而导致无限循环。

快速解决方案是将while条件从change != 0更改为change >= 0.01

更好的解决方案是使用整数类型(例如int)并使其存储分数(因此一美元将为100)。这种方法不会有任何浮点数不准确。

答案 1 :(得分:2)

0.1,0.05或0.01等数字不能完全表示为二进制浮点数。因此,change可能永远不会变为零。

除了使用整数或BCD之外,您还可以在检查零时允许公差,例如

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

答案 2 :(得分:1)

也许这是一个浮点问题。你的双精度“变化”永远不会完全等于整数零,因此你的“同时”测试将始终是真实的。尝试做一些事情 while(更改&gt; = epsilon)

另外......尝试使用if else-if链...