Java查找数组最接近平均值的数及比较逻辑异常排查
问题根因
触发全部分支误判的核心是变量赋值被意外覆盖
实际执行逻辑
- 你前期计算数组算术平均值时,确实正确算出了值为23.0的平均值并完成打印
- 后续计算方差的代码块中,你直接复用了存储算术平均值的同名
average变量,把原本存的23.0覆盖成了样本方差的计算结果:
// 这行代码直接覆盖了原本存算术平均值的average变量 average = total/(arr.length-1); double deviation = Math.sqrt(average);
- 后续编写高于/低于平均值判断的循环时,调用的
average已经不是最初的23.0,而是被覆盖后的样本方差值——以你输入的数组为例,这个值计算结果为540.5,数组中最大的元素62也远小于这个值,因此所有元素都会被判定为“低于平均值”,完全匹配你遇到的输出现象。
修正方案
- 给不同统计量使用独立变量名,避免同名变量互相覆盖:
- 存储算术平均值的变量不要和后续方差计算的变量复用同一个名字
- 分支判断逻辑直接使用最初计算得到的算术平均值即可
- 修正后的核心代码参考:
// 计算算术平均值,单独命名避免被后续计算覆盖 double arithmeticMean = total / arr.length; System.out.println("Average is: " + arithmeticMean); total = 0; // 计算统计量时单独命名存储,不修改原来的平均值变量 for (i =0; i<arr.length; i++){ total += Math.pow((arr[i] - arithmeticMean), 2); } double sampleVariance = total/(arr.length-1); double deviation = Math.sqrt(sampleVariance); System.out.println("Variance is: "+ sampleVariance); // 分支判断直接使用独立存储的算术平均值 for (i=0; i<arr.length; i++) { if (arr[i] > arithmeticMean) { System.out.println("Numbers above average: " + arr[i]); } else if (arr[i] < arithmeticMean) { System.out.println("Numbers below average: " + arr[i]); } else { System.out.println("Wrong!"); } }
附加细节修正
- 原低于平均值的输出语句中,分号被误写到字符串内部,修正为正常冒号即可
- 如果要实现“找出数组中最接近平均值的数”的需求,无需先拆分高于/低于的分组,遍历计算每个元素与平均值的绝对差值,记录差值最小的元素即可
内容的提问来源于stack exchange,提问作者dtaskin
相关产品推荐
相关产品推荐

