C语言十进制转二进制函数出错求助:部分输入结果偏移1
十进制转二进制函数的问题根源及修复方案
你的函数出现偏移问题的核心原因是使用了浮点数函数pow()来计算10的幂次,浮点数的精度误差会导致计算结果偏离预期整数。
具体原因:
pow()是C标准库中用于计算幂的浮点数函数,返回double类型结果。对于较小的指数(比如0、1),pow(10,i)能精确得到整数结果,但当指数增大(比如i=2时),浮点数无法精确表示所有整数,可能返回类似99.9999999999这样的值。当这个值被强转为整数参与运算时,小数部分会被直接截断,变成99而非预期的100,最终导致bin的累加结果少1,出现偏移。
比如输入4(二进制应为100),计算到最后一步时:
n=1,n%2=1,此时pow(10,2)返回近似99.999999的值- 乘以1后得到99.999999,加到
bin(此时为0)中,因为bin是int类型,会被截断为99,最终返回99而非正确的100。
修复方案:
用整数变量维护位权,完全避免浮点数运算的精度问题。初始化一个整数power表示当前位的权重(初始为1,对应10^0),每次循环后将power乘以10,这样所有运算都是精确的整数操作。
修复后的代码:
int dtob(int n) { int bin = 0; int power = 1; while(n >= 1) { bin += (n % 2) * power; n = n / 2; power *= 10; } return bin; }
额外说明:
原函数还有个局限:无法处理负数输入。如果需要支持负数的十进制转二进制,还需要额外处理符号位,但针对你当前的输入范围(0及以上正整数),修复后的代码就能正常工作。
内容的提问来源于stack exchange,提问作者Sharvansh Shukla
相关产品推荐
相关产品推荐

