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

为什么部分十进制浮点数转二进制的Python代码运行结果不符合预期

问题原因分析
  • nextn变量赋值逻辑缺失:仅在当前二进制位为1时给nextn赋值为减去当前位权后的剩余值,位为0时没有更新nextn,导致下一轮递归传入的参数还是上一轮的旧剩余值,计算逻辑完全错误。
  • 全局变量滥用:bina、ori、nextn均为全局变量,函数首次调用完成后不会自动重置,重复调用会出现结果叠加的问题,递归过程中全局变量的状态也容易出现不可预期的错误。
  • 缺少合理的终止条件:十进制小数转二进制大多是无限循环序列,仅设置x==0作为终止条件,一方面浮点数存在精度误差几乎不可能刚好等于0,另一方面没有限制计算位数,会一直递归直到达到Python默认的递归深度限制,所以输出的列表长度远大于预期的20位。
  • 浮点数相等判断不可靠:浮点数本身存在精度丢失问题,直接使用x == 0作为终止判断非常容易出现死循环或者提前/延后终止的问题。
修复后的代码

这里将递归改为更稳定的循环实现,同时增加了位数限制和精度阈值:

def ftob(x, max_bits=20, precision=1e-10):
    bina = []
    current_weight = 0.5
    remaining = x
    while len(bina) < max_bits and remaining > precision:
        if remaining >= current_weight:
            bina.append(1)
            remaining -= current_weight
        else:
            bina.append(0)
        current_weight /= 2
    return bina

print(ftob(0.876))

运行后输出为[1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1],和预期的正确二进制小数完全匹配。

内容的提问来源于stack exchange,提问作者Tim Chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:09:01