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

C++类型转换是否自动取整?g++编译结果与预期不符咨询

浮点数精度导致的数值偏差问题分析

你的代码

#include <string>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;

int main(){
    uint64_t value = uint64_t(1693829987930866899) / 1000.0;
    std::string str_value = std::to_string(value);
    printf("value=%lu, str_value=%s len=%lu\n", value, str_value.c_str(), str_value.size());
}

实际输出

value=1693829987930867, str_value=1693829987930867 len=16

问题根源

这不是g++的自动取整操作,核心原因是double类型的精度不足以精确表示你的原始数值:

  • double类型的有效精度是53位二进制,对应约15-17位十进制数。而你使用的1693829987930866899是19位十进制数,超出了double的精确表示范围。
  • 当你把这个uint64_t数值转换为double时,它会被自动近似为最接近的可表示double值——这个近似值比原始值略大,实际对应1693829987930867000左右的数。
  • 用这个近似后的浮点数除以1000.0,结果就是1693829987930867,转成uint64_t后自然得到这个结果。

正确解法

要得到预期的截断结果,直接用整数除法替代浮点数除法即可:

uint64_t value = 1693829987930866899 / 1000;

整数除法会直接舍弃小数部分,得到你想要的1693829987930866。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:46:16