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

使用Bisection Method编写程序出现无限循环输出浮点数问题求助

问题排查和修复方案

核心问题原因

  • 循环条件逻辑完全错误
    你当前使用的while (num_of_months * (monthly_salary * (ans / 100)))**2 - amount_needed >= epsilon不符合二分法终止要求:首先多了无意义的平方运算,完全偏离了「判断总存款和首付差值是否在误差范围内」的核心需求;其次没有对差值取绝对值,当总存款小于首付时表达式结果为负,会直接异常跳出循环,只有差值为正且大于等于epsilon时才会进入循环,逻辑完全错位。
  • 提前四舍五入导致死循环
    你每次计算新的ans后都直接四舍五入到两位小数,当low和high的差值小于等于0.01时,新计算的ans再做四舍五入后会卡在两个固定值反复横跳,永远无法满足退出条件,就会持续打印日志。
  • 缺少边界校验兜底
    如果用户输入的年薪过低,就算36个月存100%的工资也凑不齐首付,二分法会永远卡在high=100的区间,也会触发死循环。

修复后代码

total_cost = 1000000
downpayment = 0.25
amount_needed = total_cost * downpayment
annual_salary = int(input("Enter the starting salary: "))
monthly_salary = annual_salary / 12
num_of_months = 36

# 前置边界校验
if monthly_salary * num_of_months < amount_needed:
    print("当前薪资36个月内存不够首付,无法计算储蓄率")
    exit()

epsilon = .01
num_of_guesses = 0
low = 0
high = 100
ans = (high + low) / 2.0

# 修正循环条件,取差值绝对值判断
while abs(num_of_months * (monthly_salary * (ans / 100)) - amount_needed) >= epsilon:
    print("Low:", low, "High:", high, "Answer:", ans)
    num_of_guesses  = num_of_guesses + 1
    current_saving = num_of_months * (monthly_salary * (ans / 100))
    if current_saving < amount_needed:
        low = ans
    else:
        high = ans
    ans = (high + low) / 2.0
    # 增加最大迭代次数兜底,避免极端情况死循环
    if num_of_guesses > 1000:
        break

ans = round(ans, 2)
print("Number Of Guesses: ", num_of_guesses)
print("推荐储蓄率:", ans, "%")

内容的提问来源于stack exchange,提问作者Memelord The First

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:06:07