提问人:jerry.pepper 提问时间:7/17/2018 更新时间:7/17/2018 访问量:286
BigDecimal/double Precision - 数字向上舍入
BigDecimal/double Precision - number rounds up higher
问:
以下方法调用的第二个 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>
答:
因为 a 无法保持那么高的精度;在初始化 :double
double
String
BigDecimal
new BigDecimal("29.99993874900002");
new BigDecimal("-89.99999435599994");
请参阅:浮点数学坏了吗?
评论
String
对于指定了 16 位数字的双精度浮点值,您正处于精度的边缘,并且只有不到 16 位的十进制精度可用。如果您完全跳过 BigDecimal,只需将双精度设置为 -89.99999435599994 并将其打印出来,您将得到 -89.99999435599995。
你的困惑与.BigDecimal
double d = -89.99999435599994;
System.out.println(d); //or inspecting it in a debugger
收益 率:
-89.99999435599995
这就是 java 中的工作方式,结合 Double.toString
定义 -representation 的方式。当文本被解释为 时,在调用任何方法之前发生此转换。JLS 第 3.10.2 章中指定了详细信息。浮点文字和 Double.valueOf(String)
的 JavaDocs。doubles
String
double
如果您需要将值表示为 ,最简单的方法是使用构造函数接受 String,正如其他答案已经指出的那样:-89.99999435599994
BigDecimal
BigDecimal bd = new BigDecimal(“-89.99999435599994”);
BigDecimal bd = new BigDecimal("-89.99999435599994");
System.out.println(bd);
收益 率:
-89.99999435599994
评论
double