BlackWidowScarlet Ответов: 1

Калькулятор ежемесячных платежей ошибка в вычислении


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


Months        Sequence  Cash Flow     Interest  Principal  Balance      Interest 2
August, 2018	1	    1,555.00	   93.64	  229.12    7,261.88	87.64
September,2018	2	    1,555.00	   93.64	  229.12    7,261.88	87.64
October, 2018	3	    1,555.00	   93.64	  229.12    7,261.88	87.64
November, 2018	4	    1,555.00	   93.64	  229.12    7,261.88	87.64
December, 2018	5	    1,555.00	   93.64	  229.12    7,261.88	87.64


Что я уже пробовал:

Вот мой код

'Formula Sample
        P = MonthPay.Text 'Monthly dblMonthlyPayment
        Num = NoTerms.Text 'Number of Terms
        r = Val(IntRate.Text / 100) / 12 'Interest dblIntRate
        I = r
        PVIFA = 1 / I - 1 / (I * (1 + I) ^ Num)
        pmt = dblPV / PVIFA
        IPmt = (r * intSeq) * (Num ^ 12) * PV.Text


        'Clear the ListBox
        grd_order.ClearSelection()


        Dim dt As New DataTable
        Dim dr As DataRow
        Dim result As New List(Of String)


   dt.Columns.AddRange(New DataColumn() {New DataColumn("Months", GetType(String)), _
      New DataColumn("Seq#", GetType(Integer)), _
      New DataColumn("Cash Flow", GetType(String)), _
      New DataColumn("Interest", GetType(String)), _
      New DataColumn("Principal", GetType(String)), _
      New DataColumn("Balance", GetType(String)), _
      New DataColumn("Interest2", GetType(String))})

        Do While intSeq <= intNumOfPayments

            CashFlow = dblPV
            PI = dblBalance * I
            PP = MonthPay.Text - PI
            P = dblBalance - PP
            interestPaid2 = dblBalance * int2


            Dim thisDay As DateTime = DateTime.Today.AddMonths(intSeq)
            While thisDay = Now()
                thisDay = thisDay.AddMonths(1)
            End While

            dr = dt.NewRow
            dr("Months") = String.Format("{0:Y}", thisDay)
            dr("Seq#") = intSeq
            dr("Cash Flow") = String.Format("{0:N}", CashFlow)
            dr("Interest") = String.Format("{0:N}", PI)
            dr("Principal") = String.Format("{0:N}", PP)
            dr("Balance") = String.Format("{0:N}", P)
            dr("Interest2") = String.Format("{0:N}", interestPaid2)

            dt.Rows.Add(dr)

            intSeq += 1
        Loop
        grd_order.DataSource = dt

willifritz

Только значения для intSeq и thisDay изменяются внутри вашего цикла, я действительно не понимаю, что вы хотите вычислить, но все остальные значения точно такие же для каждой итерации, как они вычисляются один раз вне цикла while.
И я бы рекомендовал вам дать вашим переменным четко читаемые имена.

1 Ответов

Рейтинг:
2

OriginalGriff

уилфриц прав - значения просто не меняются внутри вашего цикла, поэтому они никогда не меняются, когда вы их отображаете.

Когда вы сталкиваетесь с подобной проблемой, не просите помощи - начните с отладчика. 5 минут с отладчиком показали бы вам, что происходит, и это намного быстрее (и более полезно), чем ждать, пока кто-то другой соберется посмотреть на это! Черт возьми, это, вероятно, быстрее, чем печатать вопрос в первую очередь! :смеяться:

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
Private Function Double(ByVal value As Integer) As Integer
    Return value * value
End Function

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!