使用stod()将字符串转换为double后存入float时数值被截断的原因及解决方法
为什么用
stod()转换后存入float会丢失小数位?怎么解决? 这问题我碰到过好多次了,核心原因其实是float和double的精度差异,咱们一步步拆解来看:
问题根源
浮点数精度上限不同
stod()会把字符串转换成64位的double类型,它能保留大约15-17位有效数字;而float是32位浮点数,最多只能保留6-7位有效数字。你例子里的字符串"4.225308642"有10位有效数字,远远超出了float的精度范围。当你把double类型的结果转存到float变量时,系统会自动做近似截断,只保留float能容纳的有效位数,所以就出现了输出4.22531的情况(刚好是6位有效数字)。输出显示的辅助验证
顺便提一句,cout默认对浮点数只显示6位有效数字,但哪怕你强制让它显示更多位数,float变量里存储的数值本身已经是近似后的结果了——本质还是精度不够导致的信息丢失,不是输出设置的锅。
解决办法
优先改用double类型
这是最彻底的解决方案,直接把temp的类型改成double,这样就能完整保留stod()转换后的精度,毕竟double的精度完全能覆盖你例子里的数值长度:cout << line3 << endl; double temp = stod(line3); cout << temp << endl;如果你需要显示全部小数位,可以搭配
setprecision调整输出格式:#include <iomanip> cout << line3 << endl; double temp = stod(line3); cout << setprecision(9) << temp << endl;必须用float时的折中方案
如果因为内存限制、接口要求等原因必须用float,那只能接受精度损失,但可以调整输出格式来显示更多位数(虽然存储的还是近似值):#include <iomanip> cout << line3 << endl; float temp = stod(line3); cout << setprecision(9) << temp << endl;不过要清楚,这只是让你看到更多近似后的小数位,原始的精确数值已经无法恢复了。
内容的提问来源于stack exchange,提问作者Xavier
相关产品推荐
相关产品推荐

