java - BigDecimal 值不正确

标签 java math bigdecimal

有谁知道为什么 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/

相关文章:

java - 无法使用 org.wildfly 构建 Java EE 项目 :wildfly-spec-api dependency

java - 形状、Drawable“形状名称”、形状继承和接口(interface)

java - Java中的玛雅历法

java - super CSV 和分组分隔符

java - 新的 BigDecimal ("0") NumberFormatException

java - 最新的 JMM 是否指定同步块(synchronized block)对于其他线程(甚至异步线程)是原子的?

c# - 计算正多边形顶点的坐标

algorithm - 给定平面上的两条线,如何找到最接近它们交点的整数点?

python - 模数如何处理也小于除数的负股息?

Javascript 大十进制 - N 次方根