При расчете необходимого количества лет функция выводит на 1 год больше Python (цикл while)
Написал функцию, которая должна рассчитывать количество лет выплаты по кредиту исходя из максимального лимита на заемщика, суммы кредита и процентной ставки.
Функция при проверке выводит на один год больше, чем необходимо. Понимаю, что нужно как-то округлять значение, чтобы не захватывать один год, или при расчете не учитывать первый год, но не могу понять, как это реализовать в функции.
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
Ответы (2 шт):
У вас почти все хорошо, только 2 ошибки:
Вместо
while limit_new < limit:примените
while limit_new <= limit:Вместо
return yearпримените
return year-1
Объяснение:
Когда
limit_new == limit, тоже все в порядке.Команда
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+проценты)**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