You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:44:16