【问题标题】:print double number in java and get wrong answer [duplicate]在java中打印双数并得到错误的答案[重复]
【发布时间】: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

【问题讨论】:

标签: java double println


【解决方案1】:

双重运算存在一些精度问题。使用 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

【讨论】:

    【解决方案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 使用浮点数进行运算时

    【讨论】:

    • 但 check2 应该是 131.325 而不是 131.3250000000002
    • @Rebecca 这正是在这种情况下您要使用BigDecimal 而不是double 的原因。另请查看this SO 页面以了解如何和为什么。
    • BigDecimal 是答案,谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2016-04-23
    相关资源
    最近更新 更多