使用fixed后如何恢复setprecision的有效数字显示模式?
C++ setprecision() 格式模式无法自动恢复的问题
C++ 中的 setprecision() 可控制数值的显示精度,支持按有效数字或小数位数输出。但实际使用中会遇到一个问题:一旦用 fixed 指定按小数位数显示后,后续再调用 setprecision() 时,哪怕不再显式写 fixed,输出仍会保持小数位数模式,无法回到预期的有效数字模式。
问题代码
#include <iostream> #include <iomanip> using namespace std; int main () { float fValue = 123.456789; cout << "123.456789 float type at 1 significant digit:" << endl; cout << setprecision(1) << fValue << endl << endl; double dValue = 123.456789; cout << "123.456789 double type at 1 decimal numbers:" << endl; cout << fixed << setprecision(1) << dValue << endl << endl; long double lValue = 123.456789876543210; cout << "123.456789876543210 long double type at 1 significant digit:" << endl; cout << setprecision(1) << lValue << endl << endl; }
实际输出
123.456789 float type at 1 significant digit: 1e+002 123.456789 double type at 1 decimal numbers: 123.5 123.456789876543210 long double type at 1 significant digit: 123.5
预期输出
123.456789 float type at 1 significant digit: 1e+002 123.456789 double type at 1 decimal numbers: 123.5 123.456789876543210 long double type at 1 significant digit: 1e+002
问题原因与解决方法
问题核心在于 fixed 是输出流的持久化格式标记,一旦设置就会绑定在流对象(如 cout)上,除非显式清除。要回到有效数字的默认模式,有两种可行方式:
调用流的
unsetf方法清除标记
在需要恢复有效数字模式的位置添加:cout.unsetf(ios::fixed);使用 C++11 及以后支持的
defaultfloat操纵符
直接用操纵符一键恢复默认浮点格式:cout << defaultfloat;
修改后的示例代码
以第一种方式为例,修改后的第三个输出段代码如下:
long double lValue = 123.456789876543210; cout << "123.456789876543210 long double type at 1 significant digit:" << endl; cout.unsetf(ios::fixed); // 清除fixed标记,回到有效数字模式 cout << setprecision(1) << lValue << endl << endl;
修改后运行代码,输出即可符合预期。
内容的提问来源于stack exchange,提问作者SK90
相关产品推荐
相关产品推荐

