我正在编写一个抵押计算器,它将填写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'
答案 0 :(得分:1)
循环中出现逻辑错误。您每次循环运行时都会更改贷款金额
Amt = Amt - PP 'setting new balance'
我注意到你在循环之上声明了TempAmt
,所以看起来你预计在某个时候需要它:);每次递减而不是Amt
并分配给RM
此外,STEP i+1
不是必需的,虽然它在这里工作,但并不严格正确。当循环初始化时,它将循环迭代设置为i
的值为PLUS 1的任何值。在这里你很幸运,因为i
在开始时默认为零。最重要的是,STEP
应该是一个常量,因为默认值是1,所以你根本就不需要它。
而paulsm4的建议也很有意义,但在像你这样的样本中,你可能会看到一些小的差异 - 例如最后只有几便士。浮点运算无疑是您未来课程中的一个主题。
答案 1 :(得分:0)
与VB.Net本身无关。
问题在于浮点数是“近似值” - 使用它们时有时会遇到“令人惊讶”的结果。类似地,当您混合浮点(例如“Intr”)和整数(例如“Intr / 100”)时,您也可以获得“惊喜”。
建议:
尝试将“i”和“payment”更改为“整数”,看看是否有任何不同的结果。
ALSO:
这些链接可能有所帮助: