我在这段代码上遇到了困难。当我输入 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/