在java中打印双号并得到错误的答案

时间:2013-09-29 06:55:08

标签: java double println

double check =0.615 * 255 -0.515 * 255 -0.100 * 255;
System.out.println(check);

为什么要获得-2.8421709430404007E-14?它应该是0.0

2 个答案:

答案 0 :(得分:3)

双重操作有一些精度问题。使用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

答案 1 :(得分:2)

调试你的数学:

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

请记住:

  • 乘法具有比Java中的添加更高的运算符优先级
  • 如果您想要控制舍入,则应使用BigDecimal 使用浮点数执行操作时