使用cout输出float/double时数字丢失及setprecision无效问题咨询
关于C++ float和double输出精度的疑问
测试代码
#include "../../std_lib_facilities.h" int main() { float floatname = 0.123456789; double doublename = 0.123456789; cout << "float = " << floatname << endl; cout << "double = " << doublename << endl; return 0; }
程序输出
float = 0.123457 double = 0.123457
疑问
为何两种类型的输出结果中都丢失了原数值中的数字6?尝试使用setprecision()函数后,倒数第二个数字仍然缺失,求解答。
解答
默认输出精度的问题
cout默认只显示6位有效数字,0.123456789的前6位有效数字是0.123456,但第7位数字是7,四舍五入后就变成了0.123457,所以看不到原数里的6、8、9。setprecision的作用与类型精度限制
- 单独使用
setprecision(n)时,cout依然按有效数字计数输出,而非小数点后的位数。 - float类型的有效精度只有约6-7位,它无法精确存储
0.123456789这个数值,实际存储的是一个近似值(比如0.123456791),所以即使设置setprecision(9),输出结果也会和原数有偏差,看起来倒数第二位数字不对。 - double类型的有效精度约15-17位,完全能精确存储
0.123456789,设置setprecision(9)后就能输出完整的9位有效数字。
验证代码(包含setprecision)
#include "../../std_lib_facilities.h" #include <iomanip> // 必须包含此头文件才能使用setprecision int main() { float floatname = 0.123456789; double doublename = 0.123456789; cout << "默认精度输出:" << endl; cout << "float = " << floatname << endl; cout << "double = " << doublename << endl; cout << "\n设置9位有效数字输出:" << endl; cout << setprecision(9); cout << "float = " << floatname << endl; cout << "double = " << doublename << endl; return 0; }
验证输出
默认精度输出: float = 0.123457 double = 0.123457 设置9位有效数字输出: float = 0.123456791 double = 0.123456789
内容的提问来源于stack exchange,提问作者markbw
相关产品推荐
相关产品推荐

