#python #python-3.x
Вопрос:
Я прохожу курс по edx и пытаюсь решить проблему, используя деление пополам для расчета ежемесячного платежа, при котором мы можем погасить долг за год. Я закодировал решение, но результаты немного отличаются от ожидаемых. Код приведен ниже. Код ответа, которым поделился edx, также указан ниже. Не могли бы вы поделиться, пожалуйста, почему мой код не дает тех же результатов? Я пытаюсь достичь точности до 2 знаков после запятой.
balance=float(input('balance = ')) annualInterestRate=float(input('annualInterestRate = ')) remainingbalance=balance low=float(remainingbalance/12) high=float(remainingbalance*((1 (annualInterestRate/12))**12)/12.0) if remainingbalancegt;0.01 or remaningbalancelt;0.01: remainingbalance=balance increment=round(float((high low)/2), 2) for i in range(1, 13): unpaidbalance=remainingbalance-increment interest=(annualInterestRate/12) * unpaidbalance remainingbalance=round(unpaidbalance interest, 2) if remainingbalancegt;0.01: low=increment elif remainingbalancelt;-0.01: high=increment print('Lowest Payment: ', increment)
Пример кода для решения, предоставленного edx
init_balance = balance monthlyInterestRate = annualInterestRate/12 lower = init_balance/12 upper = (init_balance * (1 monthlyInterestRate)**12)/12.0 epsilon = 0.03 while abs(balance) gt; epsilon: monthlyPaymentRate = (upper lower)/2 balance = init_balance for i in range(12): balance = balance - monthlyPaymentRate ((balance - monthlyPaymentRate) * monthlyInterestRate) if balance gt; epsilon: lower = monthlyPaymentRate elif balance lt; -epsilon: upper = monthlyPaymentRate else: break print('Lowest Payment:', round(monthlyPaymentRate, 2))
Результаты моего Кода:
баланс = 320000
годовых процентов = 0,2
Самый низкий платеж: 29591,88
Результаты Edx: баланс = 320000
Годовой процент = 0,2
Самый низкий Платеж: 29157,09
Комментарии:
1. Вы уверены, что имеете в виду
remainingbalancegt;0.01 or remaningbalancelt;0.01
и нетremainingbalancegt;0.01 or remaningbalancelt;-0.01
? Эта петля прерывается только тогда, когда остаток баланса составляет ровно 1 пенни.2. Ага. Нам нужно, чтобы оплата была произведена с точностью до одного цента
3. Перечитайте мой комментарий. Я думаю, вы неправильно поняли, что я писал или что делает ваш код. Почему вы хотите сохранить баланс == .01 точно, что и делает ваш код.
4. Эй, Фрэнк! Спасибо, что занялись этим вопросом. Было бы лучше, если бы мы могли получить остаток баланса==0. Мы должны быть точны до единого цента, поэтому, даже если мы совершаем платежи таким образом, чтобы остаток баланса==0, это тоже нормально. Во-вторых, одна из проблем в приведенном выше коде заключалась в том, что я использовал цикл if вместо цикла while
5. Именно это я и имел в виду. Вы хотите, чтобы баланс находился между-.01 и .01. Это не то, что вы написали.