计时工薪资计算C代码逻辑错误排查(多输入计算异常)
计时工薪资计算代码逻辑错误排查
核心错误点
- 时间单位完全搞反:代码把用户输入的每周工时除以4来计算每月工时,这完全违背需求逻辑。需求明确每月正常工时20小时、最多加班20小时,若用户输入的是每周工时,正确转换应该是乘以4得到每月工时,而不是除以4。这是多用户计算异常的根本原因。
- 整数截断丢失精度:
hoursWorked是整数类型,执行hoursWorked = hoursWorked /4.0时,浮点数结果会被强制截断为整数(比如每周21小时会被算成每月5小时,实际应为5.25小时),直接导致薪资计算偏差。 - 平均薪资累加逻辑冗余混乱:
hAverage重复乘以4,且当工时超出正常范围时固定累加4*20*hourly,和需求中“正常薪资”的定义不匹配,进一步放大多用户计算的误差。
修正后的关键代码示例
case 'h': case 'H': overtimeHours = 0; hoursWorked = 0; hourly = 0.0; salary = 0; puts("Please enter your hourly wage and hours worked."); scanf(" %f %d", &hourly, &hoursWorked); // 修正:假设输入的是每周工时,转换为每月工时(乘以4) float monthlyHours = hoursWorked * 4.0; int regularHours = 0; int overtime = 0; if (monthlyHours > 40) { // 每月总工时上限40:20正常+20加班 regularHours = 20; overtime = 20; } else if (monthlyHours > 20) { regularHours = 20; overtime = monthlyHours - 20; } else { regularHours = monthlyHours; overtime = 0; } // 计算总薪资和正常薪资累加 hTotal += regularHours * hourly + overtime * hourly * 1.25; hAverage += regularHours * hourly; hCounter++; break;
修正说明
- 修正时间单位转换逻辑,确保每月工时计算正确;
- 使用float类型存储每月工时,避免整数截断导致的精度丢失;
- 简化薪资计算逻辑,让正常工时和加班工时的划分更清晰,多用户累加时不会出现逻辑冲突。
内容的提问来源于stack exchange,提问作者Addie Owens
相关产品推荐
相关产品推荐

