为什么在C++中pow(10,5)= 9,999

Kin*_*uoc 11 c++ mingw pow

最近我写了一段代码:

const int sections = 10;

for(int t= 0; t < 5; t++){
   int i = pow(sections, 5- t -1);  
   cout << i << endl;
}
Run Code Online (Sandbox Code Playgroud)

结果是错误的:

9999
1000
99
10
1
Run Code Online (Sandbox Code Playgroud)

如果我只使用这个代码:

for(int t = 0; t < 5; t++){
    cout << pow(sections,5-t-1) << endl; 
}
Run Code Online (Sandbox Code Playgroud)

问题不再发生:

10000
1000
100
10
1
Run Code Online (Sandbox Code Playgroud)

有没有人给我解释?非常感谢你!

tas*_*oor 12

由于浮点值的表示pow(10.0, 5)可能是9999.9999999或类似的东西.将其分配给已截断的整数时.

编辑:如果cout << pow(10.0, 5);它看起来像输出四舍五入,但我现在没有任何支持文件确认.

编辑2:BoBTFish发表的评论和这个问题证实了pow(10.0, 5)直接使用的时候是cout圆满的.

  • 这并不能解释为什么直接打印不会打印9999.9999999 (4认同)
  • `std :: cout`会将浮点数舍入到指定数量的有效数字,可以使用`std :: setprecision`操纵符进行更改.因此,如果您尝试输出"99.9999"(记住实际上是它可以管理的最接近的近似值,而不是确切的数字),精度为4,则舍入将"一直带"1并打印100 . (4认同)
  • 如果默认精度小于小数位数,则它将被舍入. (2认同)

Lig*_*ica 0

pow全局命名空间中一定有一些损坏的函数。std::pow由于 ADL,然后在第二个示例中改为“自动”使用。

在第一个示例中,或者t实际上是一个浮点量,并且您遇到了舍入错误。