Python对分搜索超出了目标

Python对分搜索超出了目标,python,bisection,Python,Bisection,我必须创建一个代码,以找到在12个月内使用二分法还清贷款所需的确切付款,以美分为单位。我为此创建的代码有效,但超出了目标。贷款将在12个月内付清,但在支付12笔款项后,最终余额应在0左右。然而,这是一个更大的负数 我使用的代码是: StartBalance = float(raw_input('Credit Balance in $: ')) AnnualRate = float(raw_input('Annual interest rate in decimals: ')) MonthlyRa

我必须创建一个代码,以找到在12个月内使用二分法还清贷款所需的确切付款,以美分为单位。我为此创建的代码有效,但超出了目标。贷款将在12个月内付清,但在支付12笔款项后,最终余额应在0左右。然而,这是一个更大的负数

我使用的代码是:

StartBalance = float(raw_input('Credit Balance in $: '))
AnnualRate = float(raw_input('Annual interest rate in decimals: '))
MonthlyRate = AnnualRate / 12.0
MinPaymentLow = StartBalance / 12.0
MinPaymentHigh = (StartBalance*(1+MonthlyRate)**12.0)/12.0
cent = 0.01
Payment = (MinPaymentHigh+MinPaymentLow)/2.0

while (Payment*12-StartBalance) >= cent:
    for month in range(0, 12):
        Balance = (StartBalance-Payment)/10*(1+MonthlyRate)   
    if Balance < 0:
        MinPaymentLow = Payment
    elif Balance > 0:
        MinPaymentHigh = Payment
    Payment = (MinPaymentHigh + MinPaymentLow)/ 2.0

print 'RESULT'           
print 'Number of months needed: 12'
print 'Montly pay: $', round(Balance,2)
StartBalance=float(原始输入('Credit Balance in$:'))
年利率=浮动(原始输入('以小数为单位的年利率:'))
月利率=年利率/12.0
MinPaymentLow=StartBalance/12.0
MinPaymentHigh=(起始余额*(1+月利率)**12.0)/12.0
分=0.01
付款=(MinPaymentHigh+MinPaymentLow)/2.0
而(付款*12起始余额)>=分:
对于范围(0,12)内的月份:
余额=(开始余额支付)/10*(1+月)
如果余额<0:
MinPaymentLow=付款
elif余额>0:
MinPaymentHigh=付款
付款=(MinPaymentHigh+MinPaymentLow)/2.0
打印“结果”
打印“所需月数:12”
打印“每月付款:$”,四舍五入(余额,2)

您的代码对我来说似乎工作得很好,但如果您得到的结果“太离谱”,可能是因为您使用的是
float
数据类型。Float是不稳定的,因为它在每次操作中都循环。给出了足够的迭代次数,您已经获得了大量资金。试着改用。此模块将小数作为索引整数值进行跟踪。

它看起来像以下几行:

for month in range(0, 12):
    Balance = (StartBalance-Payment)/10*(1+MonthlyRate)   
应该是:

Balance = StartBalance
for month in range(0, 12):
    Balance = (Balance-Payment) * (1 + MonthlyRate)  

或类似的事情,取决于你如何计算利息,以及你是否考虑在月底或月底支付。

你如何测试你生产的价值是否正确?似乎您使用的贷款/利息计算方法与您测试的不同。我还没有编写测试代码,但我使用了在线债务计算器并手动进行了检查。问题是你每个月还清150美元,那么上个月你将还清50美元的债务,但你将还清150美元。这将使您的帐户余额为-100美元,而它应该为0美元(或接近于零)。我通过为while循环创建不同的条件并将if和elif语句设置为(余额谢谢你的输入!我可以用小数代替浮点数?因为当我尝试用小数代替浮点数时,它会给我一个错误。我得到的结果有时与每月支付的结果一样远,舍入误差似乎有点大,但这可能只是我自己。