获得错误的结果以评估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()); }