2013-09-04 3 views
0

나는 이분법을 사용하여 12 개월 만에 대출금을 지불해야하는 정확한 지불액을 찾기 위해 코드를 만들어야합니다. 내가 작성한 코드는 작동하지만 타겟을 오버 슛합니다. 대출은 12 개월 내에 상환되지만 12 회 지불 후 최종 잔액은 약 0이되어야합니다. 그러나 그것은 더 큰 음수가되는 방법입니다.Python Bisection 검색 overshoots 대상

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

생산하는 가치가 올바른지 어떻게 테스트하고 있습니까? 당신이 테스트하고있는 것보다 다른 대출 /이자 계산을 사용하고있는 것 같습니다. – James

+0

테스트 코드를 작성하지는 않았지만 온라인 채무 계산기를 사용하여 수동으로 점검했습니다. 문제는 매달 예를 들어 $ 150를 지불하고, 마지막 달에 50 달러의 빚을지게되지만 $ 150를 지불하게됩니다. 이로 인해 계정 잔고는 $ 100 (또는 0에 가까워 야 함) 인 반면 $ 100입니다. – Pim

+0

while 루프에 대해 다른 조건을 만들고 if 및 elif 문을 (balance <0 및 balance <-cent) 및 그 반대의 경우로 설정하여 문제를 해결했습니다. 그래도 도움을 주셔서 감사합니다. – Pim

답변

0

그것은이 라인과 같습니다

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) 

또는 이와 유사한, 당신이 관심을 계산하는 방법에 따라 당신은 시작에서 발생하는 지불을 고려 여부 달의 끝.

0

귀하의 코드는 나를 위해 잘 작동하는 듯,하지만 당신은 결과를 얻는다면 당신은 float 데이터 유형을 사용하고 있기 때문에 "오프 방법은"그것은 아마 것을 :

내가 사용하고 코드입니다 . 플로트는 모든 작업을 반복하므로 신뢰할 수 없습니다. 충분한 반복을 감안할 때 많은 돈을 버렸습니다. 대신 decimal을 사용해보세요. 이 모듈은 인덱스 된 정수 값으로 소수를 추적합니다.

+0

입력 해 주셔서 감사합니다! float 대신 소수점을 사용할 수 있습니까? 왜냐하면 나는 float에 대해 substitute decimal을 시도 할 때 오류가 발생하기 때문입니다. 내가 얻는 결과는 월별 지불액만큼 멀리 떨어져있는 경우도 있지만, 반올림 오류가 많은 것으로 보일 수 있지만 그저 나일 수 있습니다. – Pim