C++ 是否在c+中设置精度+;圆形的如果是这样,为什么我会看到这个?

C++ 是否在c+中设置精度+;圆形的如果是这样,为什么我会看到这个?,c++,floating-point,C++,Floating Point,以下代码段输出了0.29847,而我本以为是0.29848: double f = 0.298475; cout << setprecision(5) << f << endl; double f=0.298475; cout数字0.298475不能精确地表示为double(因为它不是分母为二次幂的分数,即11939/40000),实际存储的数字实际上更接近于0.29847,而不是0.29848。从文档setprecision()中可以看出不执行任何舍入,只

以下代码段输出了0.29847,而我本以为是0.29848:

double f = 0.298475;
cout << setprecision(5) << f << endl;
double f=0.298475;

cout数字
0.298475
不能精确地表示为
double
(因为它不是分母为二次幂的分数,即11939/40000),实际存储的数字实际上更接近于0.29847,而不是0.29848。

从文档setprecision()中可以看出不执行任何舍入,只设置小数点后显示的最大位数。双精度和浮点数的可能表示可能不同于您使用的常量初始值设定项。

0.298474999999999031885525268634967505931854248046875,准确地说。换句话说,实际上有两个舍入步骤:一个是将文本
0.298475
转换为
双精度,另一种是在
cout
@dan04上打印一些数字时:这是一种有点无意义的显示;64位IEEE754浮点值只包含大约17位十进制数字的信息…@KerrekSB,但由于它是一个分母除以10次方的有理数,因此可以精确地表示为十进制数。这样做通常有助于消除关于浮点数舍入和显示行为的误解。@DanielFisher:做什么有用?注意,我们从有限的十进制表示开始,所以我们必须有一个有理数,其分母除以十的幂。
double f = 0.123459;
cout << setprecision(5) << f << endl;
double f = 0.123454;
cout << setprecision(5) << f << endl;