首页 > 解决方案 > 双值之和,奇怪的结果

问题描述

如果我测试以下代码,我会得到一些奇怪的结果。我知道双打存在问题,因为 IEEE-754 中的 2.1 不是 2.1。但是这些难道不应该都是同样错误的吗?前三个给4.2,最后一个给4.200000000000001

public static void main(String[] args) 
{
  double[] arr1 = {0.2, 0.2, 0.2, 0.5, 0.5, 0.5, 2.1};
  double[] arr2 = {0.5, 0.5, 0.5, 0.2, 0.2, 0.2, 2.1};
  double[] arr3 = {2.1, 0.5, 0.5, 0.5, 0.2, 0.2, 0.2};
  double[] arr4 = {2.1, 0.2, 0.2, 0.2, 0.5, 0.5, 0.5};

  System.out.println(sumarray(arr1, 0, arr1.length-1));
  System.out.println(sumarray(arr2, 0, arr2.length-1));
  System.out.println(sumarray(arr3, 0, arr3.length-1));
  System.out.println(sumarray(arr4, 0, arr4.length-1));
}

public static double sumarray(double[] arr, int p, int r) {
  double sum=arr[p];
  for (int k=p+1; k<=r; k++) {
    sum = sum + arr[k];
  }
  return sum;
}

标签: javadoubleprecision

解决方案


只需放入System.out.println()sum 循环中,您就会看到不同之处 - 错误是在不同的步骤中引入的。有时它们会得到缓解。有时它们会不受控制地生长。

0.4
0.6000000000000001
1.1
1.6
2.1
4.2
RES: 4.2

1
1.5
1.7
1.9
2.1
4.2
RES: 4.2

2.6
3.1
3.6
3.8000000000000003
4
4.2
RES: 4.2

2.3000000000000003
2.5000000000000004
2.7000000000000006
3.2000000000000006
3.7000000000000006
4.200000000000001
RES: 4.200000000000001

推荐阅读