为什么增加两个双打给出了错误的答案?

时间:2015-11-22 08:49:10

标签: java double addition

为什么以下程序的输出结果为5069137140999999500.000000?

public class Add
{
    public static void main (String[] args) throws java.lang.Exception
    {
        double b=5069137140000000000.000000;
        double s=1000000000.000000;
        System.out.printf("%f",(b+s));
    }
}

2 个答案:

答案 0 :(得分:0)

在Java中,double值是IEEE浮点数。它们无法准确表示,即使它们具有高精度。这就是为什么一些浮点运算将包括这些浮点数中存在的舍入误差的原因。

数字的来源实际上并不重要,无论是解析字符串还是指定双字面。问题源于浮点表示。

答案 1 :(得分:0)

该程序演示了以下内容:

总和的确切值5069137141000000000.0恰好落在两个完全可表示的数字之间,即5069137140999999500.000000和 5069137141000000500.000000。

其中,较低的一个,你得到的答案是均匀的,因此是正确的舍入结果。

public class Test {
  public static void main(String[] args) {
    double b=5069137140000000000.000000;
    double s=1000000000.000000;
    System.out.printf("%f%n",(b+s));
    double exact = 5069137141000000000.0;
    System.out.printf("%f%n", exact);
    System.out.printf("%f%n", Math.nextUp(exact));
    System.out.println(Long.toHexString(Double.doubleToLongBits(exact)));
  }
}

输出:

5069137140999999500.000000
5069137140999999500.000000
5069137141000000500.000000
43d1964c57d3c2d4