有谁知道为什么 BigDecimals 在下面的情况下输出不正确的结果?
double a = 2400;
double b = 3600;
double c = 8;
MathContext mc = new MathContext(14);
BigDecimal aa = new BigDecimal(2400);
BigDecimal bb = new BigDecimal(3600);
BigDecimal cc = new BigDecimal(8);
System.out.println("Doubles: " + (a/b*c));
System.out.println("Big Ds: " + (aa.divide(bb, mc).multiply(cc)));
输出:
Doubles: 5.333333333333333
Big Ds: 5.33333333333336
欢迎提出想法和想法。
最佳答案
与手动计算完全一样。
2/3: 0.66666666666667
*8: 5.33333333333336
2/3: 0.66666666666667
8 x
----------------
56
48
... +
----------------
*8: 5.33333333333336
这对于许多人的数字感来说可能是违反直觉的。 但最后7个0.1/3的误差太大了;乘以 8 变成 3,四舍五入为误差,因此最后一位数字变为 3 + 误差 3 == 6。
<小时/>为了最小化除法的舍入误差:
aa.multiply(cc).divide(bb, mc)
double 计算使用的精度约为 16 位数字,仅比 14 位多一点。
关于java - BigDecimal 值不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47388907/