首页 > 解决方案 > 复制固定价值年金等式的代码,但未给出正确答案

问题描述

我正在构建一个金融计算器,我正在开发的一个部分是找到固定年金的未来价值。定期年金(即期末支付)的公式为:

PMT/i * ((1+i)^n - 1) * (1+iT)

其中PMT是 每期付款ti = r/m是增长率r除以每期复利次数mn是复利期数m*tT是一个01价值变量,表明它是普通年金还是到期年金。

我对特定功能的方法是:

public static decimal FutureFixedAnnuityValue(decimal annuity, float time, float interest, int nCompPeriods = 1, int startImmediately = 0)
{
    return annuity / (decimal)interest * (decimal)(Math.Pow(1 + interest / nCompPeriods, time * nCompPeriods) - 1) * (decimal)(1 + interest / nCompPeriods * startImmediately);
}

这边,PMT = annuity, t = time, r = interest, m = nCompPeriods, T = startImmediately

为了收集参数,我使用这个按钮单击方法:

private void btnCalculate_Click(object sender, EventArgs e)
{
    decimal payment = decimal.Parse(txtAnnuity.Text); //PMT
    int periods = int.Parse(txtPeriods.Text); //t
    float gain = float.Parse(txtEnterInterest.Text) / 100; //r
    float length = float.Parse(txtEnterYears.Text); //m
    int immediately = chkPaymentAt.Checked ? 1 : 0; //due or ordinary

    decimal afv = FinanceCalculations.FutureFixedAnnuityValue(payment, length, gain, periods, immediately);
    lblAnnuityFixed.Text = afv.ToString("C2");
}

为了测试我的方法是否有效,我使用了这个在线计算器:https ://www.calculatorsoup.com/calculators/financial/future-value-annuity-calculator.php 。

有了参数PMT = 1000, t = 10, r = 1, m = 12, T = 0,我的应用程序给出了$10 512.49,但计算器给出了$10 464.39。但是,如果我更改m = 1我的应用程序和计算器都给出$10 462.21.

我不知道是什么导致了这种差异。我尝试过更改annuity / (decimal)interest为,annuity / (decimal)(interest/nCompPeriods)但直觉上没有意义,因为降低分母会进一步增加输出,并且测试它证实了我的怀疑,因为我的输出变为$126 149.88.

那么发生了什么?我无法弄清楚是什么导致了这种差异。似乎它与 的分母有关annuity / (decimal)interest,但我只是不知道它可能是什么。

标签: c#finance

解决方案


我已经弄清楚了我的问题。这与支付频率与复利周期数不一致的事实有关。发生这种情况时,必须重新计算以使用此处找到的方程找到r有效速率。然后,支付频率(称为)代替,并且重新计算,而不是。qminqm

完成后,错误就修复了。我在函数中添加了一个paymentFrequency整数参数,用于检查是否nCompPeriodspaymentFrequency. 如果匹配,则原来的计算就足够了,否则interest必须转化为另一个有效率并paymentFrequency代替nCompPeriods


推荐阅读