我一直致力于制作一个程序来计算变化,程序永远不会运行并在完成后终止。我不知道我的代码有什么问题。如果有人能帮助那就好了。
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);
}
答案 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链...