使用Math方法保留两位小数出错:充电时间计算值异常求助
充电时间计算四舍五入错误问题排查与解决
我正在完成一项作业,需要生成包含各类数值的表格,但遇到了问题:充电时间(Laddningstid(h))被四舍五入为16.0,而正确结果应为15.57(因35.8/2.3=15.57)。请问我哪里出错了?如何得到正确的计算值?
代码如下:
class Main { public static void main(String[] args) { double batteryEffect = 35.8; int current = 10; int current1 = 16; int current2 = 32; int voltage = 230; int voltage1 = 400; double calcEffect = 0; int noOfDecimals = 2; double scale = 0; scale = Math.pow(10, noOfDecimals); calcEffect = Math.round(current*voltage)*scale/scale/1000; double calcCharge = 0; calcCharge = Math.round(batteryEffect/calcEffect)*scale/scale; System.out.print("Batteri" + " " + batteryEffect + "(kWh)"); System.out.print("\n"); System.out.print("\nStröm(A)\tSpänning(V)\tLaddeffekt(kW)\tLaddningstid(h)"); System.out.print("\n======================================================="); System.out.print("\n"); System.out.print(current + "\t\t\t" + voltage + "\t\t\t" + calcEffect + "\t\t\t\t" + calcCharge); System.out.print("\n"); System.out.print(current1 + "\t\t\t" + voltage); } }
错误原因
问题出在calcCharge的计算逻辑上:
- 你先执行了
Math.round(batteryEffect/calcEffect),35.8/2.3的结果是15.5652...,Math.round会把这个值四舍五入到最近的整数16。 - 之后再乘以
scale(100)再除以scale,结果还是16.0,完全丢失了小数部分的精度。
修正方案
要保留两位小数的正确结果,需要先将除法结果放大100倍,再做四舍五入,最后缩小回原比例:
calcCharge = Math.round((batteryEffect / calcEffect) * scale) / scale;
这样计算时,15.5652... * 100 = 1556.52...,Math.round后得到1557,再除以100就得到15.57,符合预期。
另外,calcEffect的写法可以简化得更严谨,避免冗余计算:
calcEffect = Math.round(current * voltage / 1000.0 * scale) / scale;
修正后运行代码,充电时间就会显示正确的15.57。
内容的提问来源于stack exchange,提问作者liligirthlord
相关产品推荐
相关产品推荐

