C语言计算用户输入奇偶数字平均值出现舍入错误如何排查
C语言平均值计算错误问题修复方案
核心错误原因
你的代码存在4类问题,共同导致了计算结果异常:
- 整数除法截断:C语言中两个
int类型变量直接运算时会执行整数除法,会直接舍弃小数部分,哪怕最终赋值给double类型也不会触发浮点运算。例如25/2的运算结果是12而非12.5,赋值后只会得到12.000000 - 统计逻辑错误
- 未单独统计奇数、偶数的输入个数,直接用总输入数减1作为所有平均值的分母,完全不符合平均值计算规则(平均值应为对应类型的总和除以对应类型的输入个数)
- 作为终止标记的0被错误计入偶数统计:用户输入0时会触发偶数判断逻辑,被加到偶数总和中,同时也被计入总计数
- 输出逻辑错误:两次打印的文案均为偶数平均值,第二次奇数平均值的文案错误,且打印时输出的分母和计算时使用的分母数值不一致
- 边界隐患:如果用户首次输入就为0,会触发除零错误导致程序崩溃
修复后完整代码
#include <stdio.h> #include <stdlib.h> void funkcja() { int sumaNiep = 0; // 奇数总和 int sumaPa = 0; // 偶数总和 int liczbaNiep = 0; // 奇数个数 int liczbaPa = 0; // 偶数个数 int userInput = 1; int i = 0; while(userInput != 0) { printf("%d. Podaj calkowita liczbe: ", i+1); scanf("%d", &userInput); // 输入为0直接退出,不参与统计 if(userInput == 0) { break; } i++; if (userInput % 2 == 0) { sumaPa += userInput; liczbaPa++; } else { sumaNiep += userInput; liczbaNiep++; } } // 计算前先判断个数避免除零,强转分子为double触发浮点除法 double sredniaNiep = liczbaNiep > 0 ? (double)sumaNiep/liczbaNiep : 0; double sredniaPa = liczbaPa > 0 ? (double)sumaPa/liczbaPa : 0; printf("\nsrednia parzysta %d / %d : %lf", sumaPa, liczbaPa, sredniaPa); printf("\nsrednia nieparzysta %d / %d : %lf", sumaNiep, liczbaNiep, sredniaNiep); } int main() { funkcja(); return 0; }
关键修改说明
- 新增两个计数变量分别统计奇数、偶数的有效输入个数,平均值计算时分母使用对应类型的计数
- 输入为0时直接终止循环,不参与任何统计和计数
- 除法运算前将分子强制转换为
double类型,触发浮点除法保留小数部分 - 增加计数非零判断,避免除零错误
- 修正输出文案、分母数值和实际计算逻辑的对应关系
内容的提问来源于stack exchange,提问作者KarolGral
相关产品推荐
相关产品推荐

