C++打印16位小数被截断为6位,使用double/long double如何解决
问题原因
你遇到的截断现象并非数据读取或存储环节出错,C++标准输出流cout默认的浮点数输出规则仅展示6位有效数字,和你存储用的double/long double精度无关,double本身的十进制有效精度可达15~17位,完全可以容纳你16位小数的常量。
解决方法
你需要引入格式控制头文件<iomanip>,在输出前修改cout的浮点数输出规则:
- 用
std::fixed指定输出格式为定点小数,此时setprecision指定的数值为小数点后保留的位数 - 用
std::setprecision(16)指定保留16位小数
修改后的完整代码
#include<iostream> #include<fstream> #include<vector> #include<iomanip> // 新增格式控制头文件 using namespace std; int main(){ vector<double> test; ifstream fin; fin.open("constants.txt"); double num; while(fin>>num){ test.push_back(num); } // 新增输出格式设置,全局生效直到被修改 cout << fixed << setprecision(16); for(int i=0; i<64; i++){ cout<<test[i]<<"\n"; } return 0; }
补充说明
如果你后续改用long double存储更高精度的常量,可以配合std::numeric_limits动态获取当前类型的最大有效精度,避免硬编码的精度设置不合理,需要额外引入<limits>头文件:
cout << fixed << setprecision(std::numeric_limits<long double>::digits10 + 1);
内容的提问来源于stack exchange,提问作者Pranav Desai
相关产品推荐
相关产品推荐

