如何在C语言中正确实现两个时间相加?解决浮点数余数问题
时间相加问题的分析与修复
核心问题
你当前代码的错误根源在于用float类型存储时间:
- 浮点数无法精确表示十进制小数,比如
20.30在内存中实际是接近20.30但存在微小误差的数值,执行start * 100后得到的可能是2029.9999...,强制转换为int就会变成2029,导致提取的分钟数错误。 - 最后返回结果时,
finMinuites / 100是整数除法,比如10 / 100会得到0,最终返回22.00而非预期的22.10,不符合时间格式的表达逻辑。
修复方案
方案1:直接传递小时和分钟(推荐)
用整数分别存储小时和分钟,完全规避浮点数精度问题,逻辑更清晰:
#include <stdio.h> // 计算结束时间:参数为开始时间的时、分,持续时间的时、分,输出结果到fin_h和fin_m void calculateFinishTime(int startH, int startM, int durH, int durM, int *finH, int *finM) { int totalMinutes = startM + durM; int totalHours = startH + durH + totalMinutes / 60; *finM = totalMinutes % 60; *finH = totalHours % 24; } int main() { int finishH, finishM; calculateFinishTime(20, 30, 1, 40, &finishH, &finishM); printf("finish = %dh %dm\n", finishH, finishM); return 0; }
方案2:兼容浮点数输入(仅当必须用h.mm格式时)
如果需要保留类似20.30的输入方式,先将浮点数转换为总分钟数处理,同时修正浮点数精度问题:
#include <stdio.h> // 将h.mm格式的浮点数转换为总分钟数 int timeToMinutes(float time) { int hours = (int)time; // 加0.5后取整,修正浮点数精度误差 int minutes = (int)((time - hours) * 100 + 0.5); return hours * 60 + minutes; } // 将总分钟数转换为小时和分钟 void minutesToTime(int totalMinutes, int *hours, int *minutes) { *hours = totalMinutes / 60 % 24; *minutes = totalMinutes % 60; } int main() { int startMinutes = timeToMinutes(20.30); int durMinutes = timeToMinutes(1.40); int finishMinutes = startMinutes + durMinutes; int finishH, finishM; minutesToTime(finishMinutes, &finishH, &finishM); printf("finish = %dh %dm\n", finishH, finishM); return 0; }
运行结果
两种方案执行后都会输出:
finish = 22h 10m
内容的提问来源于stack exchange,提问作者Roman Savushkin
相关产品推荐
相关产品推荐

