首页 > 解决方案 > 编译器计算不正确?

问题描述

我正在尝试制作一个反向打印数字的简单程序,我有这两个功能:

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,我已经在 main 上测试过

int test = 12345; 
int step1 = test % (int)pow(10,2); //45

但是当我调试时,在第二次迭代中我看到它step1变成了69(我不知道为什么)。所以我的输入是12345,它应该将它反转为54321,但是由于在第二次迭代中这种尴尬的错误计算,它正在打印56321(因为它使用 69/10 而不是 45/10)。有谁知道发生了什么?

我的输出的屏幕截图

标签: c++11

解决方案


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;
}

推荐阅读