Java for循环计算首数字后整数平均值始终输出0如何解决
问题原因
你的代码始终输出0,核心问题和隐藏逻辑错误如下:
- 最致命的问题是外层for循环逻辑完全失效:你定义的循环初始值
i = j(j为当前行字符串长度-1),循环判断条件是i < j,条件从初始化开始就不成立,整个循环体一次都不会执行,sum始终是初始化的0,最终输出自然为0。 - 其余隐藏逻辑错误:
- 求和范围错误:原本的求和逻辑从数组索引0开始累加,会把代表数字个数的第一个数字也算进总和,不符合需求
- 整数除法精度丢失:两个int类型运算结果仍为int,会直接截断小数部分,就算求和正确也无法得到2.0这类带小数的平均值
- 重复冗余计算:把字符串拆分、转整数数组的逻辑放在循环内部,就算循环能执行也会重复做无意义的运算
- 平均值计算位置错误:把除法运算放在循环内部,若循环多次执行会重复做除法,结果完全错误
- 输出截取逻辑硬编码:用
st.substring(2)截取后续数字的写法,遇到第一个数是两位及以上的情况(比如第一行是10 1 2 ...)会截取错误
修正后可运行代码
public static void main(String[] args) throws IOException { File num = new File("numbers.txt"); // 自动关闭流,避免资源泄漏 try (BufferedReader br = new BufferedReader(new FileReader(num))) { String line; while ((line = br.readLine()) != null) { // 每行仅做一次拆分、类型转换 String[] segments = line.trim().split(" "); int[] values = Stream.of(segments) .mapToInt(Integer::parseInt) .toArray(); int count = values[0]; int sum = 0; // 从索引1开始累加,跳过第一个计数位 for (int i = 1; i < values.length; i++) { sum += values[i]; } // 强转成double做除法,保留小数位 double average = (double) sum / count; // 输出结果,避免硬编码截取字符串的问题 StringBuilder numStr = new StringBuilder(); for (int i = 1; i < values.length; i++) { numStr.append(values[i]).append(" "); } System.out.printf("The average of the %d integers %s the average is %.1f%n", count, numStr.toString().trim(), average); } } }
效果验证
针对你给出的测试用例行3 1 2 3:
- 读取到count=3,累加索引1到3的数值:1+2+3=6
- 浮点除法计算6/3=2.0,输出结果和预期完全一致
内容的提问来源于stack exchange,提问作者mislepone
相关产品推荐
相关产品推荐

