Получить бесконечность в результате расчета платежа по ипотеке в Visual Basic

Я учусь на первом курсе программирования и пытаюсь сделать калькулятор ипотечных платежей. Пользователи вводят сумму кредита и процентную ставку, выбирают 15 или 30 лет в качестве продолжительности срока, и их ежемесячный платеж должен быть рассчитан. Я думаю, что математика верна, но я думаю, что у меня проблемы с преобразованием типов данных. Единственный результат, который я могу рассчитать, это «Бесконечность». Я также пытался объявить все переменные как Doubles, но без разницы.

Ниже приведен фрагмент кода, с которым у меня возникли проблемы, и Option Strict On включен в полный код. Любые советы будут очень признательны!

    Dim decLoanAmount As Decimal
    Dim decInterestRate As Decimal
    Dim decFifteen As Decimal = 180D
    Dim decThirty As Decimal = 360D
    Dim decNumberOfMonths As Decimal
    Dim dblPayment As Double
    Dim decPayment As Decimal

    ' Did user enter a numeric value?

    If IsNumeric(txtLoanAmount.Text) And IsNumeric(txtInterestRate.Text) Then
        decLoanAmount = Convert.ToDecimal(txtLoanAmount.Text)
        decInterestRate = Convert.ToDecimal(txtInterestRate.Text)

        ' Is Loan Amount greater than zero?
        If decLoanAmount > 0 And decInterestRate > 0 Then
            If radFifteen.Checked = True Then
                decNumberOfMonths = decFifteen
            ElseIf radThirty.Checked = True Then
                decNumberOfMonths = decThirty
            End If

            ' Calculate the monthly payments as a double
            dblPayment = (decLoanAmount * (decInterestRate / 12 / 100) * (1 + (decInterestRate / 12 / 100) _
                ^ decNumberOfMonths)) / ((1 + (decInterestRate / 12 / 100) ^ decNumberOfMonths) - 1)
            ' Convert double to decimal
            decPayment = Convert.ToDecimal(decPayment)
            ' Display monthly payment
            lblPayment.Text = decPayment.ToString("C2")

        Else
            If decLoanAmount < 0 Then
                MsgBox("Please enter a valid loan amount.", , "Input error")
            End If

            If decInterestRate < 0 Then
                MsgBox("Please enter a valid interest rate.", , "Input error")
            End If

        End If

    Else
        ' Display error message if user entered a negative value.
        MsgBox("Please enter a numeric value.", , "Input Error")
    End If
End Sub

person SJW    schedule 07.12.2014    source источник
comment
Я бы предложил немного разложить его на множители и проверить, что значения соответствуют вашим ожиданиям - например, (decInterestRate / 12 / 100) повторяется в расчете, так почему бы не вычислить это заранее и проверить, что значение соответствует вашим ожиданиям.   -  person Rowland Shaw    schedule 08.12.2014
comment
Кроме того, decPayment = Convert.ToDecimal(decPayment) не собирается много делать...   -  person Rowland Shaw    schedule 08.12.2014
comment
Вы не ожидаете, что люди здесь будут писать и/или отлаживать код для вас, верно? Покажите нам некоторые исследования, предоставьте пример ввода, вывода, объясните немного больше. Предположим, что приведенного выше кода не было, как вы думаете, достаточно ли того, что вы описали, чтобы помочь вам?   -  person Neolisk    schedule 08.12.2014
comment
возможно, вы имели в виду decPayment = Convert.ToDecimal(dblPayment)?   -  person Ňɏssa Pøngjǣrdenlarp    schedule 08.12.2014


Ответы (1)


Судя по формуле из Википедии, вы делаете это неправильно. Это должно выглядеть примерно так:

dblPayment = (decLoanAmount * (decInterestRate / (12 * 100))) / (1 - (1 + (decInterestRate / (12 * 100))) ^ (-decNumberOfMonths))

А еще эта строчка странная

decPayment = Convert.ToDecimal(decPayment)

Должно быть

decPayment = Convert.ToDecimal(dblPayment)
person the_lotus    schedule 08.12.2014