jer*_*per 2 java precision bigdecimal
以下方法调用中的第二个调用setYCoordinate(),得到的值不正确-89.99999435599995而不是-89.99999435599994.
第一次调用setXCoordinate()得到正确的值29.99993874900002.
setXCoordinate(BigDecimal.valueOf(29.99993874900002))
setYCoordinate(BigDecimal.valueOf(-89.99999435599994))
Run Code Online (Sandbox Code Playgroud)
我在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));
}
Run Code Online (Sandbox Code Playgroud)
valueOf收到的参数即"双val"本身在检查时为-89.99999435599995.为什么?我在Maven pom.xml中设置了Java版本,如下所示
<java.version>1.8</java.version>
Run Code Online (Sandbox Code Playgroud)
因为一个double不能保持那么多精度; 你不应该使用a double,而是String在初始化你的时候BigDecimal:
new BigDecimal("29.99993874900002");
new BigDecimal("-89.99999435599994");
Run Code Online (Sandbox Code Playgroud)
请参阅:浮点数学是否已损坏?
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |