2016-09-27 79 views
1

下面我有一段代碼可以計算信用卡餘額,但當balance有一個極端值(如下面的balance=9999999999)時它不起作用。它通過無限循環拋出代碼。我有一些關於如何解決這個缺陷的理論,但不知道如何與他們一起前進。這裏是我的代碼:爲什麼我的代碼中有無限循環?

balance = 9999999999 
annualInterestRate = 0.2 
monthlyPayment = 0 

monthlyInterestRate = annualInterestRate /12 
newbalance = balance 
month = 0 

while newbalance > 0: 
    monthlyPayment += .1 
    newbalance = balance 

    for month in range(1,13): 
     newbalance -= monthlyPayment 
     newbalance += monthlyInterestRate * newbalance 
     month += 1 
print("Lowest Payment:" + str(round(monthlyPayment,2))) 

我的理論是 while newbalance > 0 導致無限循環,因爲NEWBALANCE比0

我怎樣才能改變這種while循環,這樣也不會引起較大的始終我的代碼無限運行?

順便說一句: 中等數字,程序運行很長時間,最後給出了答案。對於更大的數字,該計劃只是繼續前進。

+0

爲什麼不在''while'循環中添加'print(newbalance)'而不是猜測值是多少? – CoryKramer

+0

您是否打印過這些值?它會幫助很多! –

+0

@MooingRawr:我認爲這是故意的;該計劃似乎是計算最低的每月付款以支付12個月的全部餘額,而不是每年增加每月付款。 (如果是每年增加每月付款,你永遠不會用這種方式付錢。) – user2357112

回答

0

如果你允許在分配中使用它,分叉法的執行速度會快得多。如果您需要通過.01增加每月付款,也無濟於事。

static_balance = balance 
interest = (annualInterestRate/12) 
epsilon = 0.01 
lo = balance/12 
hi = balance 

while abs(balance) > epsilon: 
    balance = static_balance 
    min_pmt = (hi+lo)/2 
    for i in range(12): 
     balance -= min_pmt 
     balance *= 1+interest 
    if balance > 0: 
     lo = min_pmt 
    else: 
     hi = min_pmt 
print("Lowest payment: ", round(min_pmt, 2)) 
+0

感謝您的時間。我試過這段代碼,它解決了我的代碼運行速度太慢的問題。但是,它不再產生正確的答案。 – gab

+0

試試這個,如果你被允許在付款的.01之內。 – BWhite

+0

謝謝!這對我有效。我被允許在付款的0.02以內,所以它是完美的。 – gab

3

此循環不是無限的,但需要很長時間才能解決。對於非常大的值balancemonthlyPayment必須變得非常大才能將其降至零。