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
相关产品推荐
相关产品推荐

