Java体操评分程序:计算的平均分与预期不符,求排查
问题分析与修复
你遇到的问题核心是计算平均分时分母使用错误:你在计算平均分时用了原数组的长度(comp1.length即10),但实际上去掉最高分和最低分后,你只统计了8个元素的总和,所以分母应该是8,而不是原数组长度。这直接导致了所有选手的平均分计算结果偏差。
错误点详解
- 对于选手1:你累加了排序后索引1到8的8个元素,但除以10,导致平均分被缩小,正确计算应该是总和除以8;
- 对于选手3:8个1.0的总和是8.0,除以10得到0.8(你输出的0.9000可能是运行时的小误差),但除以8就能得到预期的1.0;
- 选手2的结果看似正确(0.0000),只是因为0除以任何数都是0,本质上分母使用错误的问题依然存在。
修复后的代码
import java.util.*; import java.text.*; public class EZD_gymnastics { public static void main (String [] args) { double comp1[] = {8.7, 6.5, 0.1, 3.2, 5.7, 9.9, 8.3, 6.5, 6.5, 1.5}; double comp2[] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; double comp3[] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; NumberFormat fmt = NumberFormat.getNumberInstance(); fmt.setMaximumFractionDigits(4); fmt.setMinimumFractionDigits(4); // 处理选手1 Arrays.sort(comp1); double sum = 0; for(int a = 1; a < 9; a++) { sum += comp1[a]; } double mean = sum / 8; // 改为除以8 String s = fmt.format(mean); System.out.println("For Competitor #1, the average is " + s + "."); // 处理选手2 Arrays.sort(comp2); double sum2 = 0; for(int b = 1; b < 9; b++) { sum2 += comp2[b]; } double mean2 = sum2 / 8; String t = fmt.format(mean2); System.out.println("For Competitor #2, the average is " + t + "."); // 处理选手3 Arrays.sort(comp3); double sum3 = 0; for(int c = 1; c <9; c++) { sum3 += comp3[c]; } double mean3 = sum3 / 8; String u = fmt.format(mean3); System.out.println("For Competitor #3, the average is " + u + "."); } }
额外优化建议
为了避免重复代码,同时让程序适配不同数量的评分(比如不是固定10个),可以提取一个通用方法来计算平均分:
private static double calculateAverage(double[] scores) { Arrays.sort(scores); double sum = 0; // 用length-1代替硬编码的9,适配任意长度的评分数组 for (int i = 1; i < scores.length - 1; i++) { sum += scores[i]; } // 总长度减2,自动计算有效评分数量 return sum / (scores.length - 2); }
之后在main方法中直接调用即可:
double mean = calculateAverage(comp1); double mean2 = calculateAverage(comp2); double mean3 = calculateAverage(comp3);
内容的提问来源于stack exchange,提问作者bugjuice
相关产品推荐
相关产品推荐

