0

我正在编写一个抵押计算器,它将填充 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'

结束子

4

2 回答 2

1

您的循环中有逻辑错误。每次循环运行时,您都在更改贷款金额

Amt = Amt - PP 'setting new balance'

我注意到你已经TempAmt在循环上方声明了,所以看起来你预计在某个时候需要它:); 递减,而不是Amt每次并分配给RM

此外,这STEP i+1不是必需的,虽然它在这里有效,但它并不完全正确。i当循环初始化时,它将循环迭代设置为 PLUS 1 的任何值。在这里你很幸运,因为i一开始默认为零。底线,STEP应该是一个常数,因为默认值是 1,所以这里根本不需要它。

paulsm4 的建议也是正确的,但在像您这样的样本中,您可能会因此看到小的偏差——例如最后几美分左右。浮点算术无疑是您将在以后的课程中学习的主题。

于 2012-08-15T14:10:10.437 回答
0

与 VB.Net 本身无关。

问题是浮点数是一种“近似值”——使用它们时有时会遇到“令人惊讶”的结果。同样,当您混合浮点(例如“Intr”)和整数(例如“Intr / 100”)时,您也可以获得“惊喜”。

建议:

尝试将“i”和“payment”更改为“integer”,看看是否有任何不同的结果。

还:

这些链接可能会有所帮助:

于 2012-08-15T05:00:30.897 回答