Работаем над проблемой, чтобы найти наименьшее число, при котором мы сможем погасить долг за год. Ответ немного не тот

#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. Это не то, что вы написали.