【问题标题】:Mortgage calculator remaining balance miscalculation按揭计算器余额计算错误
【发布时间】:2012-08-15 04:46:20
【问题描述】:

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

结束子

【问题讨论】:

    标签: vb.net amortization


    【解决方案1】:

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

    Amt = Amt - PP 'setting new balance'
    

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

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

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

    【讨论】:

    • @O'Neil 是的,我确实忘记改回来了。我确实尝试使用“Amt”来修复它。我确实尝试将其改回并进行您提到的更正,但我仍然在剩余金额中遇到相同的错误。我没有将 IP 和 PP 变量放在循环之外,因为在 IPMT 和 PPMT 函数中它需要支付号码。也许我用错了这些功能?我确实需要说这些都是很好的建议,因为我不知道 for 循环中的自动递增变量。还有关于浮点运算的建议。
    • 啊,是的,您对 IPMT 和 PPMT 需要付款号码是正确的 - 我已经将其编辑了。也就是说,如果我只是将 Amt 更改为 TempAmt 并带有注释“设置新平衡”以及后面的注释,那么您的代码对我有用
    • @O'Neil 是的,你是对的!我尝试将所有Amt 更改为TempAmt 但一旦我认为它需要PPMT 和IPMT 功能的原始贷款金额,它就被修复了!感谢您提供有用的建议,让我走上正轨!
    • 很高兴我能帮上忙,原来你离得不远。如果有机会,您能否将问题标记为已回答?谢谢,祝你在课程的其余部分好运。
    • 抱歉,这个问题可能很明显,但这是我第一次使用 stackoverflow。如何将其标记为已回答?
    【解决方案2】:

    与 VB.Net 本身无关。

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

    建议:

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

    还有:

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

    【讨论】:

    • 非常感谢您的快速回复!我刚刚在程序中尝试过,得到了相同的结果……我还尝试将 Yrs 更改为整数,得到了相同的结果。我从来不知道浮点数。这是个好建议。还有其他可以解决这个程序的提示吗?
    • 单步调试器并查看值。另外:循环中可能只是一个"off-by-one" 错误。
    • 谢谢!我不知道调试功能有这一步。经历它真的让我看到了我的错误。我一直在想,对于 IPMT 和 PPMT 函数,它需要贷款变量中的剩余贷款余额,但它需要原始贷款金额。谢谢你和奥尼尔!
    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2017-04-01
    • 2015-11-06
    • 2012-03-12
    相关资源
    最近更新 更多