我试图创建一个反向打印数字的简单程序,我有这两个函数:
void get_numbas(int numbah){
for(int i = 1; i <= 5; i++){
step1 = numbah % (int)pow(10,i);
step2 = step1/(int)pow(10,i-1);
std::cout << step2;
}
}
我对第二个函数的输入是12345
,在第二次迭代中,step1
应该变成45
,我已在主要测试
int test = 12345;
int step1 = test % (int)pow(10,2); //45
但是当我调试时,在第二次迭代中,我看到step1
变为69
(我不知道为什么)。所以我的输入是12345
,它应该将其反转为54321
,但是由于在第二次迭代时这种笨拙的错误计算,它打印56321
(因为它使用69 / 10而不是45/10)。有没有人知道发生了什么?
答案 0 :(得分:1)
pow
是一个浮点函数。浮点存在固有的不准确性。 pow(10,5)
的结果可能会变成9999.999999837204183
或类似的结果。然后你的代码向下舍入(而不是舍入到最接近的整数),产生一个意想不到的结果。
这解释了您在第二次迭代中对69
的观察,因为12345 % 99
给出了69
。
我建议重新设计基于整数的代码,以便不使用中间浮点运算,例如: :
uint32_t dividend = 1;
for(int i = 1; i <= 5; i++)
{
step1 = numbah % (dividend * 10);
step2 = step1 / dividend;
dividend *= 10;
std::cout << step2;
}