【问题标题】:algorithm that calculates a minimum amount to be paid to pay off a balance in 12 months计算在 12 个月内还清余额所需支付的最低金额的算法
【发布时间】:2015-09-11 17:44:51
【问题描述】:

我正在努力解决一个问题,即计算在 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

我遇到的问题是,我最终的每月付款只比我应得的多一点。在这种情况下,monthly_payment 的回报是 320 而不是 310。对于所有用例,我都尝试过monthly_payment,它略高于应有的值。

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

【问题讨论】:

  • 您的利息按月计算,基于您的欠款。这意味着您的 after_12_months_interest 无效,因为它会计算整个金额的利息。
  • 有一个众所周知的公式可以根据起始余额、利率和付款次数计算付款。找到那个公式,代码就变成了单行代码。

标签: python


【解决方案1】:

强制单行

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)))

这是做什么的:

  • next 采用迭代器的第一个元素。
  • count 尝试从 0 到无穷大的值(仅在每次调用 next 时,并且仅在返回值之前)
  • 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))

这个通过reduceing the original_balance 12 次来计算债务的总余额。

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2016-05-06
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多