双值之和,奇怪的结果

问题描述 投票:0回答:1

如果我测试以下代码,则会得到一些奇怪的结果。我知道double存在问题,因为2.1在IEEE-754中不是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;
}
java double precision
1个回答
0
投票

只需将System.out.println()放在求和循环中,您将看到其中的区别-错误在不同的步骤引入。有时它们会缓解。有时它们无法控制地生长。

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
© www.soinside.com 2019 - 2024. All rights reserved.