Ипотечный калькулятор просчет остатка остатка
Я пишу ипотечный калькулятор, который будет заполнять 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" и посмотреть, если вы получите какие-либо другие результаты.
ТАКЖЕ:
Эти ссылки могут помочь: