java - java 收银机的舍入误差

标签 java

我在这段代码上遇到了困难。当我输入 95.95 作为购买价格和 100 作为支付价格时,我不断收到舍入错误,例如,它返回 4 美元、4 便士,而不是 4 美元和 5 便士。所有其他值都工作正常,但由于某种原因,当小数位为 0.95 或 0.05 时,很难返回正确的便士...

public static void main(String[] args){

        //Read price per pack
        Scanner in = new Scanner(System.in);

        System.out.println("Enter purchase price: ");
        double purchasePrice = in.nextDouble();
        System.out.println("Enter amount paid: ");
        double amountPaid = in.nextDouble();

        //Compute change due

        if (amountPaid < purchasePrice)
        {System.out.printf("Error, you need more money!");
        }

        else {
        int diff = (int)(( amountPaid - purchasePrice)*100);


        int dollars = diff/100;
            diff = diff%100;

        int quarters = diff/25;
            diff = diff%25;

        int dimes = diff/10;
            diff = diff%10;

        int nickels = diff/5;
            diff = diff%5;

        int pennies = diff/1;
            diff = diff%1;

        System.out.println("--------------------");    
        System.out.println("Total Change due: " + (amountPaid - purchasePrice));
        System.out.println("--------------------");
        System.out.println("Dollars: " + dollars);
        System.out.println("Quarters: " + quarters);
        System.out.println("Dimes: " + dimes);
        System.out.println("Nickels: " + nickels);
        System.out.println("Pennies: " + pennies);

        }
    }
}

最佳答案

你的问题是线路

int diff = (int)(( amountPaid - purchasePrice)*100);

将美分数向下舍入到价格 100 倍以下的下一个 int。由于 double 不一定准确地表示十进制数,因此在进行乘法时可能会出现浮点错误,该错误会放大 100 倍。产品可能略高于或低于整数美分,因此四舍五入可能会导致金额向下舍入,几乎是整美分。

您真正想要做的是将美分数的 double 值四舍五入到最接近的 int,而不是下一个 int 下面。您可以通过在四舍五入之前添加 0.5 来做到这一点。

int diff = (int)(( amountPaid - purchasePrice)*100 + 0.5);

但一般来说,如果您想用它进行精确的计算,则永远不应该使用 double 来存储金额。我建议学习使用 BigDecimal 类,这样的问题就会消失。

关于java - java 收银机的舍入误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48604353/

相关文章:

java - 如何在 Java 中漂亮地打印 XML 属性?

java - Container 类中 Paint(Graphics g) 方法中 Graphics g 的值

java - 在 vert.x 顶点中包含 jars

java - 从 EJB 引用 WEbContent 文件夹中的文件(未找到文件异常)

java - 匹配 arraylist 中的字符串,其中字符串是 arraylist 串联的结果

javascript - java npapi 插件的替代品

java - 是否可以使用来自 CA 的 keystore (该 keystore 用于签署 JAR,也可用于签署 CSR)以创建 SSL 证书

java - 打破一个类,或者强加一个接口(interface)来限制访问?

java - 是否有一个现有的带有用户身份验证的基本 Java Web 应用程序,我可以将其用作快速入门的模板?

java - 在声明时初始化的数组直到调用 super 构造函数之后才实际初始化