【问题标题】:Calculating change in a program - Floating point error计算程序中的变化 - 浮点错误
【发布时间】:2017-03-04 17:06:39
【问题描述】:

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

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

}

【问题讨论】:

  • 不要在这样的程序中使用浮点值。请改用整数(便士)。
  • @PaulMcKenzie 我已将硬币设为整数,但它不起作用。
  • 你调试了吗?更改可能小于 0,这是您允许的。
  • @Asker123 当我说使用便士时,我的意思是任何事情都使用便士。一美元是 100,四分之一是 25,镍是 5,等等。所以你的计算根本不会使用double,而是使用纯整数算术,这是精确的(见下面的答案)。跨度>
  • @Asker123 See this link and read it carefully。对于任何希望成为计算机程序员并且必须处理这样的计算的人来说,这是必须的。在许多情况下,需要进行金钱和财务计算才能计算出精确值,因此绝对不能使用 double

标签: java eclipse methods


【解决方案1】:

double 类型是 floating point,浮点数以精度换取性能。在某些时候,当您从change 中减去美分时,它会小于 0.01 但大于零,它会小于零。

在这两种情况下,您的所有if 条件都将为假,但while 条件仍然为真,从而导致无限循环。

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

更好的解决方案是使用整数类型(例如int)并让它存储美分的数量(所以一美元就是100)。这种方法不会有任何浮点数不准确。

【讨论】:

  • 知道了。感谢那。我还确保添加便士++,因为更改总是会少一分钱。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    也许这是一个浮点问题。您的双精度“更改”永远不会完全等于整数零,因此您的“while”测试将始终评估为真。尝试按照以下方式做一些事情 而(更改 >= epsilon)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多