为什么a + = b * pow(10,c-i-1)== 99 c ++?

时间:2016-09-28 20:01:36

标签: c++ c++11 pow math.h cmath

我写了这段代码,第一次循环结果是99.为什么结果99,应该是100?

#include <iostream>
#include<math.h>
using namespace std;
int main ()
{
  int skt = 0;
  int sk[3];
int nsk = 3;
sk[0]=1;
sk[1]=2;
sk[2]=8;
for (int i=0; i<nsk; i++)
{
    skt = skt + (sk[i]*pow(10.0,nsk-i-1));
    cout <<" "<<skt<<endl;
}

}

此代码的结果

   99
   119
   127

,但如果我使用库cmath则是正确答案

#include <iostream>
#include<cmath>
using namespace std;
int main ()
{
  int skt = 0;
  int sk[3];
int nsk = 3;
sk[0]=1;
sk[1]=2;
sk[2]=8;
for (int i=0; i<nsk; i++)
{
    skt = skt + (sk[i]*pow(10.0,nsk-i-1));
    cout <<" "<<skt<<endl;
}

}

此代码的结果

    100
    120
    128

有人可以解释原因吗?

3 个答案:

答案 0 :(得分:0)

来自此链接cplusplus.com

  

此标头(cmath)中为其他算术类型组合(Type1和Type2)提供了额外的重载:这些重载在计算之前有效地将其参数强制转换为double,除非至少有一个参数的类型为long double(在这种情况下,两者都被转换为long double而不是。)

我敢打赌如果你施展它会在math.h中正确

答案 1 :(得分:0)

pow的math.h和cmath版本略有不同。基本上,cmath版本支持更多输入。你可以在这些链接上比较两者。

math.hcmath

答案 2 :(得分:0)

正如人们所评论的那样,它可能与变量类型转换和浮点错误有关。 Pow操作双打,可能有浮点错误。机会是pow返回一个类似99.9999999的值,然后转换为整数。由于整数转换截断而不是舍入,因此得到99。