Python债务偿还程序问题求助:循环异常与还款额偏差
分析与修复你的债务还款计算程序
我帮你排查出代码里的两个核心问题,正是它们导致了无限循环和计算偏差的问题,咱们一步步来解决:
问题1:月份变量未重置,导致后续循环失效
你只在函数开头把month初始化为0,第一次执行内层循环后,month会被累加至12。之后每次外层循环尝试测试新的月还款额(MP)时,month已经是12了,内层循环的month < 12条件永远不成立——这意味着后续的MP根本没有经过12个月的还款计算,balance被重置为初始值后就再也没变化,自然永远大于0,程序陷入无限循环。这就是MP增量小的时候(比如每次加10)程序跑不完的原因。
问题2:MP测试逻辑断层,导致计算偏差过大
当你把MP增量设为70及以上时,第一次测试的MP可能足够大,刚好能在12个月内把余额降到0以下,程序直接返回这个MP。但实际上可能存在更小的MP就能还清债务——只是因为后续循环因为month没重置根本没机会测试那些中间值,所以返回的MP会比实际需要的大很多,偏差自然就大了。
修复后的代码
def NoDebt(balance, annualInterestRate): ''' balance -> int/float, the amount of debt youre in annualInterestRate -> interest rate (divide by % 100 first) ''' initial_balance = balance monthly_interest_rate = annualInterestRate / 12.0 monthly_payment = 10 # 初始测试的月还款额 while True: current_balance = initial_balance month = 0 # 每次测试新的还款额时,重置月份计数 while month < 12: # 计算当月还款后余额,再加上月利息 current_balance = (current_balance - monthly_payment) * (1 + monthly_interest_rate) month += 1 # 如果12个月后余额小于等于0,说明这个还款额足够 if current_balance <= 0: return monthly_payment # 否则,增加还款额继续测试 monthly_payment += 10
关键修改点说明
- 重置月份计数:把
month = 0移到外层循环内部,确保每次测试新的月还款额时,都从第1个月开始重新计算全年的余额变化。 - 优化循环逻辑:外层循环改为
while True,直到找到符合条件的还款额才返回,逻辑更直观。 - 变量命名优化:把
MIR、MP这类缩写改成更易懂的名称,后续维护起来更方便。
你可以测试一下这个修复后的版本,不管增量是10还是更大的值,都能正确找到最小的月还款额啦。
内容的提问来源于stack exchange,提问作者Tabbish Aziz
相关产品推荐
相关产品推荐

