使用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
相关产品推荐
相关产品推荐

