有谁知道为什么下面的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
欢迎提出想法和想法。
答案 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位。