信用卡债务最低还款额的二分查找:答案总是偏差过大

-1 投票
3 回答
2666 浏览
提问于 2025-04-17 17:06

我的代码是:

balance = 320000
annualInterestRate = 0.2

originalBalance = balance
month = 1
monthly_interest = annualInterestRate / 12
low = originalBalance/12
high = (originalBalance*(1 + monthly_interest)**12)/12
epsilon = 0.01
min_payment = (high + low)/2.0

while min_payment*12 - originalBalance > epsilon:
    while month < 13:
        balance = (originalBalance - min_payment)/10 * (1+ monthly_interest)
        if balance <= 0.00:
            low = min_payment
            min_payment = (high + low)/2.0
        elif balance > 0.00:
            high = min_payment
            min_payment = (high + low)/2.0
        month += 1
print "Lowest payment: " + str(round(min_payment, 2))

但是,我得到的结果是26666.0,而我实际上应该得到29157.09。我哪里出错了呢?

3 个回答

0

我在做同样的练习时,注意到了你代码的一些地方:

if balance <= 0.00:
  low = min_payment
  min_payment = (high + low)/2.0

不过,我觉得你应该把高的值设为最小支付金额。如果余额小于零,那说明你支付的太多了,所以你新的二分查找需要找到一个比你上次猜的最小支付金额还要小的数字。

0

我觉得你可能犯了一个错误,你写的这行代码 high = (originalBalance*(1 + monthly_interest)**12)/12 是在把 high 设置为余额乘以(1加上利息)。这部分是没问题的。但是,你把这个结果的12次方再除以12。在你的代码里,balance = 3000,加上2%的利息后变成3060。把这个3060的12次方计算出来,结果是一个非常大的数字,超过了6.74乘以10的41次方,我自己都搞不懂这个数字。再把这个数字除以12,结果还是一个超大的数字,大约是5.61乘以10的40次方。这个数字太长了,程序可能会崩溃(或者运行得特别慢)。在其他任何事情能正常工作之前,这个问题必须先解决。

2

你忘记把 month 重置了——它只会变成 13 一次,然后里面的循环就再也不会运行了。

balance = 320000
annualInterestRate = 0.2

originalBalance = balance
month = 1
monthly_interest = annualInterestRate / 12
low = originalBalance/12
high = (originalBalance*(1 + monthly_interest)**12)/12
epsilon = 0.01
min_payment = (high + low)/2.0

while min_payment*12 - originalBalance > epsilon:
    month = 1          # < -- do this
    while month < 13:
        balance = (originalBalance - min_payment)/10 * (1+ monthly_interest)
        if balance < 0.00:
            low = min_payment
            min_payment = (high + low)/2.0
        elif balance > 0.00:
            high = min_payment
            min_payment = (high + low)/2.0
        month += 1
print "Lowest payment: " + str(round(min_payment, 2))

撰写回答