下面的第二个方法调用setYCoordinate()获得了错误的值-89.99999435599995,而不是-89.99999435599994。
对setXCoordinate()的第一次调用获得正确的值29.99993874900002。
setXCoordinate(BigDecimal.valueOf(29.99993874900002))
setYCoordinate(BigDecimal.valueOf(-89.99999435599994))
我在BigDecimal.valueOf()中放置了一个断点-该方法的代码如下所示-
public static BigDecimal valueOf(double val) {
// Reminder: a zero double returns '0.0', so we cannot fastpath
// to use the constant ZERO. This might be important enough to
// justify a factory approach, a cache, or a few private
// constants, later.
return new BigDecimal(Double.toString(val));
}
当检查时,valueOf接收到的参数,即“ double val”本身为-89.99999435599995。为什么?我在Maven pom.xml中设置了Java版本,如下所示
<java.version>1.8</java.version>
最佳答案
因为double
不能保持那么高的精度;初始化double
时,您不应使用String
,而应使用BigDecimal
:
new BigDecimal("29.99993874900002");
new BigDecimal("-89.99999435599994");
参见:Is floating point math broken?