为什么以下程序的输出结果为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));
}
}
答案 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