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

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

}

最佳答案

double 类型为 floating point , float 以精度换取性能。在某些时候,当您从变化中减去美分时,它会变得小于0.01但大于零,它会变得小于零。

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

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

更好的解决方案是使用整数类型(例如 int)并让它存储美分的数量(因此 1 美元等于 100)。这种方法不会有任何 float 不准确的情况。

关于java - 计算程序中的变化 - 浮点错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42598770/

相关文章:

Java字节码解释器

java - 如何配置 Kafka 使其表现得像一个 FiFo 队列?

perl - 如何使用 Pod::Weaver 为方法定义多个小节?

java - 全屏视频 View

android - Multiselectlistpreference android检索值

java - setAnimationStyle() 的显式动画,我的选择是什么?

java - 在 IProject 中搜索文件 - Eclipse

python - 限制内部使用方法调用者

javascript - 将构造函数原型(prototype)添加到 javascript 对象

java - 在 if 中放置一个返回 boolean 值的方法在功能上等同于直接调用该方法吗?