2015-09-11 43 views
1

我在計算爲了在12個月內還清信用卡餘額而需要的最低固定每月支付的問題而苦苦掙扎。通過固定的每月付款,我的意思是每個月不變的單一數字,而是一個固定金額,10個倍數和所有月份相同,每個月都會支付。 (這是可能的平衡,使用該支付方案,這是OK成爲負)算法計算在12個月內還清餘額所需支付的最低金額

所以作爲輸入我有

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,它比它應該稍微多一些。

任何人都可以給我一個提示或想法,我做錯了請。謝謝

+1

您的興趣每月計算,基於您*還*欠的。這意味着你的'after_12_months_interest'無效,因爲它計算整個利息。 – njzk2

+0

根據起始餘額,利率和支付次數計算支付有一個衆所周知的公式。找到這個公式,代碼變成一行代碼。 –

回答

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需要一個迭代器的第一個元素。從0
  • count嘗試值無窮大(每次只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)) 

這一個計算由reduce債務的組合餘數荷蘭國際集團的original_balance 12倍。