【发布时间】:2013-09-29 06:55:07
【问题描述】:
double check =0.615 * 255 -0.515 * 255 -0.100 * 255;
System.out.println(check);
为什么要得到 -2.8421709430404007E-14?它应该是 0.0
【问题讨论】:
-
@JunedAhsan 因为当你使用计算来计算它应该是0,因为156.825-131.325-25.5=0
double check =0.615 * 255 -0.515 * 255 -0.100 * 255;
System.out.println(check);
为什么要得到 -2.8421709430404007E-14?它应该是 0.0
【问题讨论】:
双重运算存在一些精度问题。使用 BigDecimal 操作而不是 double 比你会得到预期的结果。
//double check =0.615 * 255 + -0.515 * 255 + -0.100 * 255;
BigDecimal check =
(BigDecimal.valueOf(0.615).multiply(BigDecimal.valueOf(255)))
.add(BigDecimal.valueOf( -0.515).multiply(BigDecimal.valueOf( 255)))
.add(BigDecimal.valueOf( -0.100).multiply(BigDecimal.valueOf( 255)));
System.out.println(check);
结果是:0.000
【讨论】:
调试你的数学:
double check0 = 0.615 * 255;
System.out.println(check0);
double check1 = -0.515 * 255;
System.out.println(check1);
double check3 = -0.100 * 255;
System.out.println(check3);
System.out.println("Result: " + (check0 + check1 + check3));
输出:
156.825
-131.32500000000002
-25.5
Result: -2.8421709430404007E-14
记住:
BigDecimal
使用浮点数进行运算时【讨论】:
BigDecimal 而不是double 的原因。另请查看this SO 页面以了解如何和为什么。