获得错误的结果以评估100 * 2.55的值
我使用下面的方法得到错误的结果。
public double evaluate(final double leftOperand, final double rightOperand) { Double rtnValue = new Double(leftOperand * rightOperand); return rtnValue.doubleValue(); }
输入参数值为:leftOperand = 100和rightOperand = 2.55
我得到了错误答案: 254.99999999999997
正确答案是255.0
使用BigDecimal
BigDecimal bd = new BigDecimal("100"); BigDecimal ans = bd.multiple(new BigDecimal("2.55")); System.out.println(ans);
也可以看看
-
使用IDE一个演示
-
在Java中保留double的精度
这是由于浮点精度问题 。 不可能在64位内表示每个有理数。 数字以IEEE 754格式存储。
如果你正在创造一个游戏,这已经足够好了,甚至漂浮都可以。 但如果你正在做一些融资,那应该是正确的。 然后你可以使用java.math.BigDecimal
。 它比double
慢得多,但它是正确的。 它需要更多的内存,因为你在内存中有一个确切的值。 这是一个关于如何使用BigDecimal的很好的教程。
使用Math.round()。
public static double evaluate(final double leftOperand, final double rightOperand) { Double rtnValue = new Double(leftOperand * rightOperand); return Math.round(rtnValue.doubleValue()); }