У меня возникли проблемы с созданием класса для моделирования кредитов с процентами и платежами

У меня возникают ошибки с математикой в ​​моем калькуляторе погашения кредита. Я пытаюсь создать класс, в котором я могу создать кредит, повторять его по месяцам или годам, а также применять платежи по кредиту. Я не совсем уверен, где моя проблема заключается в этом коде.

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

class loan():

    p_i = 0 #initial principle
    p_new = 0 #total balance
    rate = 0 #interest rate (in %)
    acc = 0 #total accrued interest

    def __init__(self,p,rate):

        self.p_i = p
        self.p_new = p
        self.rate = rate

    def month(self):

        if self.p_i == self.p_new:
            self.acc += self.p_i * (1 + (self.rate/100)/12)
            self.p_new = self.p_i + self.acc
        else:
            self.acc += self.p_i * (1 + (self.rate/100)/12)
            self.p_new = self.p_i + self.acc

    def year(self):

        if self.p_i == self.p_new:
            self.acc += self.p_i * (1 + (self.rate/100)) - self.p_i
            self.p_new = self.p_i + self.acc 
        else:
            temp = 0
            temp = self.p_i * (1 + (self.rate/100)) - self.p_i
            self.p_new += temp
            self.acc += temp

    def payment(self,amount):

        temp = 0
        if amount < self.acc:
            self.acc -= amount
        else:
            self.p_i -= amount - self.acc
            self.acc = 0
            self.p_new -= amount

Я ожидаю, что результат, скажем, для кредита в 10000 долларов с процентной ставкой 5% будет 10500, а затем 11025, а начисленные проценты будут 1025, вместо этого я получаю 11000 и 1000 соответственно.


person Dumpy_Soup    schedule 29.05.2019    source источник
comment
Без отладки математики я бы рекомендовал принять предложения по стилю в PEP 8. Кроме того, инициализациями в объявлении class являются переменные класса; было бы неплохо оставить их и определить все необходимые переменные экземпляра с помощью __init__. Как бы то ни было, значения экземпляра перезапишут инициализацию класса, кроме для acc, которую вы не устанавливаете в __init__.   -  person kungphu    schedule 29.05.2019


Ответы (1)


Я бы порекомендовал вам для начала вынести это из класса и просто делать это процедурно, пока вы не научитесь математике. Кажется, вы немного боретесь с синтаксисом class.

Так что просто попробуйте установить переменные и некоторые функции, а затем перебрать некоторые параметры.

Начните с чего-то вроде этого:

principal = 10000
rate = 0.05

def monthly_interest():
    global principal, rate
    principal += rate/12*principal

def make_payment(payment):
    global principal
    principal -= payment


for month in range(1,13):
    monthly_interest()
    # print totals
    print('month {:2d}, principal ${:0.2f}'.format(month, principal))

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

Выход:

month  1, principal $10041.67
month  2, principal $10083.51
month  3, principal $10125.52
month  4, principal $10167.71
month  5, principal $10210.08
month  6, principal $10252.62
month  7, principal $10295.34
month  8, principal $10338.24
month  9, principal $10381.31
month 10, principal $10424.57
month 11, principal $10468.00
month 12, principal $10511.62
person AirSquid    schedule 29.05.2019