我正在构建一个金融计算器,我正在开发的一部分是找到固定年金的未来价值。定期年金(即期末付款(的等式为:
PMT/i * ((1+i)^n - 1) * (1+iT)
其中PMT
是每期t
的支付,i = r/m
是增长率r
除以每期复利m
,n
是m*t
的复利期数,T
是0
或1
价值变量,表示它是普通年金还是到期年金。
我针对特定函数的方法是:
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
分母有关,但我只是不知道它能是什么。
我已经解决了我的问题。这与付款频率与复利期数量不一致的事实有关。发生这种情况时r
必须重新计算,以使用此处找到的等式找到有效比率。然后,支付频率(称为q
(取代m
,并且用q
而不是m
重新计算i
和n
。
完成此操作后,错误将得到修复。我在我的函数中添加了一个paymentFrequency
整数参数,用于检查nCompPeriods
是否与paymentFrequency
相同。如果它们匹配,则原始计算就足够了,否则必须将interest
转换为另一个有效利率,paymentFrequency
代替nCompPeriods
。