C++十进制转二进制程序:输入5-7失效,大于7正常?
问题原因
你这段代码的问题出在pow(10,i)的使用上。pow是C标准库的浮点运算函数,返回double类型值。由于浮点数的精度限制,当计算pow(10,2)时,实际得到的可能不是精确的100,而是类似99.9999999999的数值。转成int类型时会直接截断小数部分变成99,最终导致二进制结果计算出错。
比如输入5(二进制应为101),第三次循环时i=2,pow(10,2)返回近似99.999999,转int后是99,ans = 1*99 +1 =100,结果就错了。而数值大于7时,比如8(二进制1000),i到3,pow(10,3)的精度误差刚好没影响(比如返回1000.0),所以结果看起来正常,但这只是巧合,写法本身存在本质隐患。
修复方案
把浮点运算的pow换成整数方式计算位权,用整型变量维护当前位权值,每次循环后乘以10即可,全程整数运算不会有精度问题。
修复后的代码:
#include<iostream> using namespace std; int main() { int n; cout << "Decimal : "; cin >> n; int ans = 0; int place = 1; // 替代pow计算位权 while(n != 0) { int bit = n % 2; ans = (bit * place) + ans; n = n / 2; place *= 10; // 位权每次乘10 } cout << "Binary : " << ans; }
额外说明
原代码中的math.h头文件已经不需要,可以直接删除,减少不必要的依赖。
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

