为什么部分十进制浮点数转二进制的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
相关产品推荐
相关产品推荐

