c++11 - 编译器计算不正确?
问题描述
我正在尝试制作一个反向打印数字的简单程序,我有这两个功能:
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)。有谁知道发生了什么?
解决方案
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;
}
推荐阅读
- java - 每隔一小时的 Java Sync 值
- php - php中的动态多级菜单
- mysql - 如何在 mysql 查询中使用 between 子句获取结果
- eclipse - 尽管安装了 CDT,但 Eclipse 插件中没有“转换为 C/C++ 项目”
- ios - iOS app name displayed on the device is wrong?
- python - user choicen variable removed off list
- docker - Jenkins with SSL over Docker
- ios - 如何使用约束从下到上为 UIView 设置动画?
- python - How to insert large amount of numbers inside a number efficiently?
- javascript - When to use (a)synchronous calls?