下面的第二个方法调用,即 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
无法保留那么高的精度;初始化 BigDecimal
时,不应使用 double
,而应使用 String
:
new BigDecimal("29.99993874900002");
new BigDecimal("-89.99999435599994");
关于java - BigDecimal/ double - 数字向上舍入更高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51371109/