下面的第二个方法调用 setYCooperative() 得到错误的值 -89.99999435599995 而不是 -89.99999435599994。
第一次调用 setXCooperative() 获得正确的值 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");
See: 浮点数学有问题吗? https://stackoverflow.com/questions/588004/is-floating-point-math-broken/588029
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)