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

C语言中函数返回值赋值给变量后输出与直接打印结果不一致

问题原因
  • float精度不足
    32位单精度浮点数的有效十进制位数仅为6~7位,而当前Unix时间戳的整数部分已经是10位量级(如1633513113),远超出float的精确表示范围。此时float对整数部分的误差最大可达数秒,小数部分的精度会完全丢失,这就是首次输出秒数偏差、毫秒值全为0的核心原因。
  • 时间取值逻辑错误
    你已经通过clock_gettime获取了同一时间点的秒数(spec.tv_sec)和纳秒数(spec.tv_nsec),却额外调用time(NULL)获取另一个时间点的秒数,两次系统调用的时间点可能存在差异,进一步引入误差。
修复方案
  1. 将getTime的返回值类型、接收返回值的变量类型从float改为double:双精度浮点数有15~17位有效十进制位,完全可以满足10位整数+6位小数的微秒级精度需求。
  2. 直接使用clock_gettime返回的spec.tv_sec作为秒数来源,无需额外调用time(NULL),保证秒和纳秒属于同一时间点。
修正后代码
#include <stdio.h>
#include <time.h>

double getTime() {
    struct timespec spec;
    clock_gettime(CLOCK_REALTIME, &spec);
    return (double)spec.tv_sec + (double)spec.tv_nsec / 1000000000.0;
}

int main() {
    double test = getTime();
    printf("\nAssignment: %f", test);

    for (int i = 0; i < 30; i ++) {
        printf("\nPrinting:   %f", getTime());
    }

    return 0;
}

内容的提问来源于stack exchange,提问作者Xiddoc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:18:04