При расчете необходимого количества лет функция выводит на 1 год больше Python (цикл while)

Рейтинг: 0Ответов: 2Опубликовано: 18.01.2023

Написал функцию, которая должна рассчитывать количество лет выплаты по кредиту исходя из максимального лимита на заемщика, суммы кредита и процентной ставки.

Функция при проверке выводит на один год больше, чем необходимо. Понимаю, что нужно как-то округлять значение, чтобы не захватывать один год, или при расчете не учитывать первый год, но не могу понять, как это реализовать в функции.

def get_years(amount: int, percent: int, limit: int) -> int:
    year = 0
    limit_new = amount
    while limit_new < limit:
        limit_new += math.floor((percent/100) * limit_new)
        year += 1
    return year
  • get_years(1600, 10, 2000)    # необходимое значение года 2  
    
  • get_years(500, 3, 550)       # необходимое значение года 3
    
  • get_years(20000, 10, 21000)  # необходимое значение года 0
    
  • get_years(5000, 5, 6500)     #  необходимое значение года 5
    
  • get_years(1000, 10, 1100)    # необходимое значение года 1
    

Ответы

▲ 1

У вас почти все хорошо, только 2 ошибки:

  1. Вместо

    while limit_new < limit:
    

    примените

    while limit_new <= limit:
    
  2. Вместо

    return year
    

    примените

    return year-1
    

Объяснение:

  1. Когда limit_new == limit, тоже все в порядке.

  2. Команда

    year += 1
    

    в конце цикла готовит проверку для следующего года, а цикл закончается тем, что условие не выполняется. И так нужно обратно убрать один год.


Проверка исправленного кода прямо вашими данными:

>>> get_years(1600, 10, 2000) # необходимое значение года 2
2

>>> get_years(500, 3, 550) # необходимое значение года 3
3

>>> get_years(20000, 10, 21000) # необходимое значение года 0
0

>>> get_years(5000, 5, 6500) # необходимое значение года 5
5

>>> get_years(1000, 10, 1100) # необходимое значение года 1
1
▲ 1

Причина отклонений результата была в том, что не учитывались проценты на проценты, т.е. каждый следующий год проценты должны считаться от суммы с процентами за прошлые периоды. Формула такая: (1+проценты)**n, где n - кол-во лет. Суть расчета в подборе той степени (кол-ва лет), при которой величина кредит*(1+проценты)**n не превысит лимит.

Вариант решения через логарифм (быстрый):

import math
def get_years2(amount: int, percent: int, limit: int) -> int:
    return int(math.log(limit / amount, (1 + percent / 100)))

Вариант решения без логарифма:

def get_years(amount: int, percent: int, limit: int) -> int:
    n = 0
    while True:
        if amount * (1 + percent / 100) ** n > limit:
            return n - 1
        n += 1


print(get_years(1600, 10, 2000))  # необходимое значение года 2
print(get_years(500, 3, 550))  # необходимое значение года 3
print(get_years(20000, 10, 21000))  # необходимое значение года 0
print(get_years(5000, 5, 6500))  # необходимое значение года 5
print(get_years(1000, 10, 1100))  # необходимое значение года 1
2
3
0
5
1