Ипотечный калькулятор просчет остатка остатка

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

Вот проблема:

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

Мой код может быть небрежным, потому что я все еще новичок в VB. На самом деле это мой первый класс.


Private Sub AmortButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AmortButton.Click 'initiate click event'
    Dim Amt As Double = Amount.Text() 'read in amount'
    Dim Intr As Double = Intrest.Text() 'read in intrest'
    Dim Yrs As Double = Term.Text() 'read in years'
    Dim payment As Double = (Yrs * 12) 'convert years to payment periods
    '
    Dim IntrDec As Double = ((Intr / 100) / 12) 'convert APR to monthly rate as a decimal'
    Dim TempAmt As Double = Amt 'setting Temperory balance
    For i As Double = 1 To payment Step i + 1 'setting for-loop paramaters'
        Dim MP = Math.Round((Pmt(IntrDec, payment, Amt) * -1), 2) 'calculate Mortgage payment'
        Dim IP = Math.Round((IPmt(IntrDec, i, payment, Amt) * -1), 2) 'calculate Intrest paid'
        Dim PP = Math.Round((PPmt(IntrDec, i, payment, Amt) * -1), 2) 'calculate priciple paid
        Amt = Amt - PP 'setting new balance'
        Dim RM = Math.Round((Amt), 2) 'rounding balance to two decimals'
        AmortTable.Rows.Add(i, MP, IP, PP, RM) 'adding row entry to table'
    Next 'end for-loop'

End Sub

2 ответа

Решение

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

Amt = Amt - PP 'setting new balance'

Я замечаю, что у вас есть TempAmt объявлено выше цикла, так что, похоже, вы ожидали, что оно понадобится в какой-то момент:); уменьшить, что вместо Amt каждый раз и назначить RM

Так же STEP i+1 не нужно, и хотя это работает здесь, это не совсем правильно. Это установит итерацию цикла на любое значение i плюс 1, когда цикл инициализирован. Здесь вам повезло, потому что i дефолт в ноль в начале. Итог, STEP должно быть константой, и так как по умолчанию используется значение 1, оно здесь вообще не нужно.

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

Ничего общего с VB.Net.

Проблема состоит в том, что числа с плавающей запятой являются "приближением" - иногда вы можете столкнуться с "удивительными" результатами, когда используете их. Точно так же вы можете получить "сюрпризы", когда вы смешиваете с плавающей запятой (например, "Intr") и целым числом (например, "Intr / 100").

ПРЕДЛОЖЕНИЕ:

Попробуйте изменить "i" и "payment" на "integer" и посмотреть, если вы получите какие-либо другие результаты.

ТАКЖЕ:

Эти ссылки могут помочь:

Другие вопросы по тегам