BigDecimal不正确的值

时间:2017-11-20 09:39:32

标签: 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

欢迎提出想法和想法。

1 个答案:

答案 0 :(得分:1)

完全按手动计算。

   *a*
   * *
   * *
**** ****
*       *
**** ****
   * *
   * *
   ***


   ***
   * *
   * *
**** a***
*   4   *
**** ****
   * *
   * *
   ***


 Hit enter. Enter anything to quit.

   ***
   * *
   * *
**** ***a
*   3   *
**** ****
   * *
   * *
   ***


 Hit enter. Enter anything to quit.

   ***
   * *
   * *
**** ****
*   1   a
**** ****
   * *
   * *
   ***


 Hit enter. Enter anything to quit.

   ***
   * *
   * *
**** ****
*   5   *
**** ****
   * a
   * *
   ***


 Hit enter. Enter anything to quit.

   ***
   * *
   * *
**** ****
*   4   *
**** ****
   * *
   * *
   a**


 Hit enter. Enter anything to quit.

   ***
   * *
   * *
**** ****
*   4   *
**a* ****
   * *
   * *
   ***


 Hit enter. Enter anything to quit.

   ***
   * *
   * *
*a** ****
*   5   *
**** ****
   * *
   * *
   ***


 Hit enter. Enter anything to quit.

   *a*
   * *
   * *
**** ****
*   6   *
**** ****
   * *
   * *
   ***


 Hit enter. Enter anything to quit.

对于许多人的数字感,这可能是违反直觉的。 但是最后7个误差为0.1 / 3太多;时间8变为3向上舍入为错误,因此最后一位数变为3 +错误3 == 6.

最小化除法的舍入误差:

2/3:    0.66666666666667
*8:     5.33333333333336

2/3:    0.66666666666667
                       8 x
        ----------------
                      56
                     48
                 ...     +
        ----------------
*8:     5.33333333333336

double 计算使用大约16位数的精度,仅略高于14位。