数组平均值计算方法逻辑错误求助:结果异常问题排查
问题分析与修复方案
嘿,我一眼就揪出问题所在啦!你的代码返回错误结果的核心原因出在整数类型的自动截断上,咱们一步步拆解:
你把累加变量ave声明成了int类型,而且在循环里每次都把(tmp / A.size)的结果直接加到ave上。因为int类型只能存储整数,每次加法都会自动砍掉小数部分,导致累加结果被严重低估:
- 第一个元素1:
1.0/5=0.2,加到int类型的ave里直接变成0 - 第二个元素9:
9.0/5=1.8,加到ave里变成1 - 第三个元素5:
5.0/5=1.0,ave变成2 - 第四个元素0:加0后还是2
- 第五个元素7:
7.0/5=1.4,加到ave里变成3
这就是你得到3的根本原因!
两种修复方案
方案1:先累加总和,最后再求平均值(更高效推荐)
这种方式避免了多次除法和小数截断问题,逻辑也更清晰:
public static int Average(Array_one A) { int sum = 0; int[] a = A.values; for (int i = 0; i < A.size; i++) { sum += a[i]; } // 如果需要带小数的精确平均值,把返回类型改成double,返回sum * 1.0 / A.size即可 return sum / A.size; }
方案2:将累加变量改为浮点类型
如果你坚持要在循环内分步计算,只需把ave改成double类型,最后再按需转成int:
public static int Average(Array_one A) { double ave = 0.0; int[] a = A.values; for (int i = 0; i < A.size; i++) { double tmp = a[i] * 1.0; ave += (tmp / A.size); } // 用Math.round()实现四舍五入,直接强制转换会截断小数 return (int) Math.round(ave); }
这样计算出来的ave会是准确的5.0,转成int后就是正确结果啦。
内容的提问来源于stack exchange,提问作者user9701731
相关产品推荐
相关产品推荐

