pow函数输出异常:使用变量与固定值结果不一致问题
问题根源:
pow()的浮点精度陷阱 你碰到的这个问题,本质是浮点函数pow()的精度误差在搞鬼,看似等效的代码,因为编译期优化和运行时计算的差异,结果完全不同。
具体原因拆解
pow()是基于浮点运算实现的,它返回的double类型值并不总是精确的整数。比如当你用变量m=2调用pow(10, m)时,实际计算结果可能是99.99999999999999而非精确的100——当你把这个值强制转换成int时,会直接截断小数部分,变成99。
我们来算一下第二个输出的过程:
n % (int)pow(10,2)→695 % 99 = 695 - 7*99 = 2- 再除以
(int)pow(10,1)→ 这里pow(10,1)可能是9.999999999,转成int是9,2/9=0(整数除法 truncate 向零取整)
第三个输出同理:
pow(10,3)可能是999.9999999,转int为999,695%999=695- 除以
(int)pow(10,2)即99,695/99=7,所以输出7
而你手动写pow(10,2)时,编译器会在编译期直接把它优化成常量100,跳过了运行时的浮点计算,所以结果是对的。
解决方案:用整数运算替代pow()
既然我们要处理的是整数位的分解,完全没必要用浮点函数,直接用整数乘法来生成10的幂,精度100%可靠:
int n = 695; int power = 1; // 提取个位 printf("%d\n", n % (power * 10) / power); power *= 10; // 提取十位 printf("%d\n", n % (power * 10) / power); power *= 10; // 提取百位 printf("%d\n", n % (power * 10) / power);
如果要处理更多位数,用循环更高效:
int n = 695; for (int power = 1; power <= 1000; power *= 10) { printf("%d\n", n % (power * 10) / power); }
这样就能得到你预期的5, 9, 6结果了。
内容的提问来源于stack exchange,提问作者twiltwil
相关产品推荐
相关产品推荐

