Jef*_*son 14 java bigdecimal double-precision
我知道以下行为是一个老问题,但我仍然不明白.
System.out.println(0.1 + 0.1 + 0.1);
Run Code Online (Sandbox Code Playgroud)
或者即使我使用 BigDecimal
System.out.println(new BigDecimal(0.1).doubleValue()
+ new BigDecimal(0.1).doubleValue()
+ new BigDecimal(0.1).doubleValue());
Run Code Online (Sandbox Code Playgroud)
为什么这个结果是:0.30000000000000004而不是:0.3?
我怎么解决这个问题?
Lou*_*man 27
你真正想要的是什么
new BigDecimal("0.1")
.add(new BigDecimal("0.1"))
.add(new BigDecimal("0.1"));
Run Code Online (Sandbox Code Playgroud)
该new BigDecimal(double)构造得到的所有的不精确性double,所以你的时候已经说过了0.1,你已经引入了舍入误差.使用String构造函数可以避免与通过构造函数相关的舍入误差double.
首先从不,从不使用BigDecimal的双重构造.在少数情况下它可能是正确的,但大多数情况下并非如此
如果您可以控制输入,请使用已提出的BigDecimal String构造函数.这样你就能得到你想要的东西.如果你已经有了double(可能会发生),不要使用double构造函数,而是使用static valueOf方法.这有一个很好的优势,我们得到双重的典型表示,至少减轻了问题..结果通常更加直观.
这不是Java的问题,而是一般计算机的问题。核心问题在于十进制格式(人类格式)到二进制格式(计算机格式)的转换。一些十进制格式的数字在没有无限重复小数的情况下无法用二进制格式表示。
例如,十进制 0.3 是 0.01001100... 二进制 但是计算机保存数字的“槽”(位)有限,因此它无法保存所有整个无限表示。它仅保存 0.01001100110011001100(例如)。但十进制数不再是 0.3,而是 0.30000000000000004。