c ++中的setprecision是圆的吗?如果是这样,我为什么看到这个?

Pal*_*han 10 c++ floating-point

以下片段输出0.29847,当我预期0.29848时:

double f = 0.298475;
cout << setprecision(5) << f << endl;
Run Code Online (Sandbox Code Playgroud)

但是,对于其他例子,我观察四舍五入:

double f = 0.123459;
cout << setprecision(5) << f << endl;
Run Code Online (Sandbox Code Playgroud)

输出:0.12346

double f = 0.123454;
cout << setprecision(5) << f << endl;
Run Code Online (Sandbox Code Playgroud)

输出:0.12345

Ker*_* SB 16

这个数字0.298475不能完全代表a double(因为它不是分母为2的幂的分数,为11939/40000),实际存储的数字实际上接近0.29847而不是0.29848.

  • 0.298474999999999990318855225268634967505931854248046875,准确地说. (4认同)
  • 换句话说,实际上有两个舍入步骤:一个是将文字“0.298475”转换为“double”,另一个是将一些数字打印到“cout”。 (2认同)
  • @ dan04:这是一个毫无意义的展示; 一个64位的IEEE754浮点数只包含大约17个十进制数字的信息... (2认同)