You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:31:24