java - 双值之和,奇怪的结果
问题描述
如果我测试以下代码,我会得到一些奇怪的结果。我知道双打存在问题,因为 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;
}
解决方案
只需放入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
推荐阅读
- css - .btn 无论我做什么,悬停都会改变背景颜色
- php - Silverstripe 4:配置 Fluent 以使 Widget 字段可翻译
- python - 错误消息:“TypeError:必须使用日志实例作为第一个参数调用未绑定的方法 w()(改为获取 str 实例)”
- sql - 如何理解这个查询?
- ios - 在发布模式下构建时显示空白屏幕的地图
- asp.net - 在 web.config 中隐藏 MVC 页面
- java - 如何使用 RSA512 算法创建签名的 JWT
- android - Android 嵌套首选项设置无法正常工作
- php - 如何在 ->get() 查询后将一组字段存储在变量中
- angular - 如何从容器组件翻译角度插值字符串