为什么C++中float或double写入文件时会被输出为整数形式?
问题原因
C++标准库的输出流默认使用std::defaultfloat格式化规则,该规则会自动省略浮点数末尾无意义的0,当小数部分全为0时,连小数点也会一并省略,因此你代码中的1.f和1.0都会被格式化为整数形式的1写入文件。
解决方案
要同时满足「保留浮点数格式(显示小数点和小数位)」和「不截断长小数」两个需求,可以通过组合流操纵符实现:
- 引入
<iomanip>头文件使用流格式控制符,引入<limits>头文件获取浮点类型的精度常量 - 用
std::showpoint强制输出小数点,避免小数全为0时省略小数点 - 将输出精度设置为对应浮点类型的
max_digits10常量值,该值是保证浮点类型值可被精确序列化、反序列化的最小有效数字位数,既不会截断有效数字,也不会输出多余的无意义位
不推荐使用std::fixed配合固定小数位的方案,该方案会强制所有浮点数按固定小数位输出,超过设置精度的数字会被截断,无法满足长小数的完整输出需求。
修改后的示例代码如下:
#include <fstream> #include <iomanip> #include <limits> int main(){ std::ofstream fs_; fs_.open("test.txt"); // 全局设置适配double类型的输出规则,如需适配float可替换为std::numeric_limits<float>::max_digits10 fs_ << std::showpoint << std::setprecision(std::numeric_limits<double>::max_digits10); fs_ << 1.f; fs_ << " "; fs_ << 1.0; fs_ << " "; fs_ << 1.034255; // 不会被截断 fs_.flush(); fs_.close(); return 0; }
运行后输出内容为:
1.0 1.0 1.034255
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

