Python ошибка "ZeroDivisionError: деление с плавающей точкой на ноль" - PullRequest
0 голосов
/ 30 января 2020

Я получаю эту ошибку, когда выполняю annuity_rate(5, 100, 510) или пытаюсь использовать отрицательные значения. Как я могу это исправить?

Хорошо работает с большим числом, но почему-то не работает для отрицательных и маленьких чисел.

def pv_annuity(r, n, pmt):
    """ Return the present value of an annuity of pmt to be received
        each period for n periods"""
    pv = pmt * (1 - (1 + r) ** (-n)) / r

    return pv


def annuity_rate(n, pmt, pv):
    """ return the rate of interest required to amortize the pv in n periods
        with equal periodic payments of pmt"""

    rate_low, rate_high = 0, 1

    while True:
        rate = (rate_high + rate_low) / 2
        #print('trying rate', rate)
        test_pv = pv_annuity(rate, n, pmt)
        #print(test_pv)
        if abs(pv - test_pv) <= 0.01:
            break

        if test_pv > pv:
            rate_low = (rate_high + rate_low) / 2

        if test_pv < pv:
            rate_high = (rate_high + rate_low) / 2

    return rate

1 Ответ

0 голосов
/ 30 января 2020

Используя ваш пример annuity_rate (5, 100, 510):

  • Rate_high будет продолжать уменьшаться независимо от того, какие условия выполняются, поскольку каждый l oop начинается с деления ставки на 2.
  • pv_test становится выше, чем pv, затем конвертируется в ноль, когда скорость слишком низкая (test_pv = pmt * (1 - (1 + r) ** (-n)) / r) поскольку знаменатель уменьшается быстрее, чем знаменатель.

  • После этого скорость продолжает уменьшаться с нулевым значением test_pv, причем еще более высокой скоростью (rate_high = (rate_high + rate_low) / 2 ).

  • Скорость в конце концов достигает 5e-324, и при дальнейшем снижении она становится почти нулевой, что приводит к (pmt * (1 - (1 + r) ** (-n) )) / r ) деление на ноль.

Предлагаемое решение: Изменить платеж в (pv_annuity (rate, n, * *) 1023 * pmt )), оно должно отражать изменения курса.

...