C++中string转float后出现精度丢失问题求助
字符串转float后精度丢失问题
问题代码
#include<iostream> #include <bits/stdc++.h> int main() { std::string str ="1570734298.45"; float val= stof(str); std::cout<<val<<std::endl; std::cout<<std::fixed<<std::setprecision(6)<<val; return 0; }
输出结果
1.57073e+09 1570734336.000000
原因分析
- float的精度上限:标准单精度float只有6-7位有效数字,你的输入
1570734298.45有11位有效数字,远超其精度范围。转换时会被舍入到float能表示的最接近值,导致整数部分出现偏差,小数部分直接丢失。 - 输出的
1570734336是float能存储的最接近原数值的近似值,并非简单截断。
解决方案
- 改用double类型:双精度double有15-17位有效数字,完全覆盖你的输入长度。修改后的代码:
#include<iostream> #include <bits/stdc++.h> int main() { std::string str ="1570734298.45"; double val= stod(str); // 替换stof为stod std::cout<<val<<std::endl; std::cout<<std::fixed<<std::setprecision(6)<<val; return 0; }
- 运行后输出:
1.57073e+09 1570734298.450000
- 若涉及金融等对精度要求极高的场景,可使用C++17引入的
std::decimal系列类型(需编译器支持),或第三方高精度数学库。
内容的提问来源于stack exchange,提问作者Sumo
相关产品推荐
相关产品推荐

