Python 计算12个月内还清余额所需支付的最低金额的算法

Python 计算12个月内还清余额所需支付的最低金额的算法,python,Python,我正在努力解决一个问题,即计算12个月内还清信用卡余额所需的最低每月固定付款额。我所说的每月固定付款,是指每月支付的一个数字,它不会每月改变,而是一个固定金额,10的倍数,所有月份都相同。(使用此付款方案,余额可能变为负值,这是正常的) 因此,作为我的投入 original_balance = 3329 annualInterestRate = 0.2 根据这一点,我计算如下: after_12_months_interest = original_balance monthlyIntere

我正在努力解决一个问题,即计算12个月内还清信用卡余额所需的最低每月固定付款额。我所说的每月固定付款,是指每月支付的一个数字,它不会每月改变,而是一个固定金额,10的倍数,所有月份都相同。(使用此付款方案,余额可能变为负值,这是正常的)

因此,作为我的投入

original_balance = 3329

annualInterestRate = 0.2
根据这一点,我计算如下:

after_12_months_interest = original_balance
monthlyInterestRate = round(annualInterestRate/12.0,2)
monthly_payment = 10
total_paid = 0

for i in range(0,12):
    after_12_months_interest = after_12_months_interest + (annualInterestRate/12.0)*after_12_months_interest

while total_paid < after_12_months_interest:
    new_balance = 0
    unpaid_balance = original_balance - monthly_payment 
    total_paid = 0
    for i in range(0, 13):
        total_paid = total_paid + monthly_payment
    if total_paid < after_12_months_interest:
        monthly_payment = monthly_payment + 10

print "Lowest Payment: ", monthly_payment
12个月后利息=原始余额
月利率=四舍五入(年利率/12.0,2)
每月付款=10
已付总额=0
对于范围(0,12)内的i:
12个月后利息=12个月后利息+(年利率/12.0)*12个月后利息
而支付的总利息<12个月利息后:
新余额=0
未付余额=原始余额-每月付款
已付总额=0
对于范围(0,13)内的i:
支付总额=支付总额+每月支付
如果支付的总利息<12个月利息后:
月付款=月付款+10
打印“最低付款额:”,每月支付
我的问题是,我最终得到的月付只比我应该得到的多一点。在这种情况下,每月支付的回报是320,而不是310。对于所有用例,我都试过按月支付,它比应该的稍微多一些

任何人都可以给我一个关于我做错了什么的提示或想法。谢谢你

必选一行 它的作用是:

  • next
    获取迭代器的第一个元素
  • count
    尝试从0到无穷大的值(仅在每次调用
    next
    时,并且仅在返回值之前)
  • 总额(付款*(1+每月)**i,范围(12))为i
    这是付款的组合值。每一笔付款都是值得的,加上所有节省下来的利息(你偿还得越早,你以后欠的利息就越少)
  • 如果没有偿还,原始余额*(1+年)
    实际上是总价值
可供替代的
打印(下一个(按计数付款的付款)(0,10)

如果减少(λx,x:(x-付款)*(1+每月),范围(12),原始余额)您的利息按月计算,以您仍然欠下的金额为基础。这意味着您的
12个月后的利息
无效,因为它计算的是全部金额的利息。有一个众所周知的公式,用于计算基于起始余额、利率和付款次数的付款。找到该公式,代码变成一行R
from itertools import count

print(next(payment for payment in count(0, 10) 
    if sum(payment*(1+monthly)**i for i in range(12)) > original_balance*(1+annual)))
print(next(payment for payment in count(0, 10) 
    if reduce(lambda x,_:(x - payment)*(1+monthly), range(12), original_balance) <= 0))