java收银机的舍入误差

java收银机的舍入误差,java,Java,我很难理解这个代码。当我输入95.95作为购买价格,输入100作为支付价格时,我不断得到一个舍入误差,例如,它返回4美元、4便士,而不是4美元和5便士。所有其他值都可以正常工作,但由于某些原因,当小数点位为.95或.05时,很难返回正确的便士 公共静态无效字符串[]args{ //阅读每包的价格 扫描仪输入=新的ScannerSystem.in; System.out.Printl输入采购价格:; 双倍购买价格=in.nextDouble; System.out.Printl输入支付金额:; 支

我很难理解这个代码。当我输入95.95作为购买价格,输入100作为支付价格时,我不断得到一个舍入误差,例如,它返回4美元、4便士,而不是4美元和5便士。所有其他值都可以正常工作,但由于某些原因,当小数点位为.95或.05时,很难返回正确的便士

公共静态无效字符串[]args{ //阅读每包的价格 扫描仪输入=新的ScannerSystem.in; System.out.Printl输入采购价格:; 双倍购买价格=in.nextDouble; System.out.Printl输入支付金额:; 支付的双倍金额=in.nextDouble; //计算到期变更 如果支付金额<购买价格 {System.out.printfError,你需要更多的钱!; } 否则{ int diff=int AMOUNTPAYED-采购价格*100; 整数美元=diff/100; diff=diff%100; 内部季度=差异/25; 差异=差异%25; int-dimes=diff/10; 差异=差异%10; 整数镍币=diff/5; 差异=差异%5; 整便士=diff/1; 差异=差异%1; System.out.println----------; System.out.PRINTLN到期变更总额:+AMOUNTPAYED-采购价格; System.out.println----------; System.out.PRINTLN美元:+美元; System.out.printlnQuarters:+quarters; System.out.printlnDimes:+dimes; System.out.printlnickels:+nickels; System.out.printlnPennies:+pennies; } } }
你的问题是线路

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

实际上,您要做的是将美分数的双精度值四舍五入到最接近的整数,而不是下面的下一个整数。你可以在四舍五入之前加上0.5

int diff = (int)(( amountPaid - purchasePrice)*100 + 0.5);
不过,一般来说,如果你想用double进行精确的计算,就不应该使用double来存储一笔钱。我建议学习使用BigDecimal类,这样的问题就会消失