计算现值

时间:2009-07-15 11:55:03

标签: .net class-library

Present Value是未来付款或一系列未来付款的给定日期的价值,折现以反映货币的时间价值和投资风险等其他因素。是的,我知道这是公式所以不需要它。

但是我想知道这个方法是否已经在.NET库中预定义了。我找不到它。 (我猜.NET不包含这个功能所以我只需要使用我自己的功能。)

我没有使用任何漂亮的第三方组件或用C#编写的示例。我必须使用一些允许任何标准.NET库的第三方脚本解决方案。我可以添加自定义引用到第三方库,甚至可以编写我自己的附加模块,但我试图避免这种情况。

4 个答案:

答案 0 :(得分:4)

在类型Microsoft.VisualBasic.Financial, Microsoft.VisualBasic.dll中,静态PV函数计算当前值。

另外值得注意的是F#中实现的Excel Financial Functions。此API可以选择与任何F#设计或运行时组件一起使用。

答案 1 :(得分:4)

您可以使用Microsoft.VisualBasic库,但这对我来说似乎不是一个非常优雅的解决方案。如果它在未来被弃用,我也不会感到惊讶。

简单的扩展将是一个很好的解决方案:

public decimal PresentValue(this decimal value, decimal interestRate, 
    decimal years)
{
    return value / Math.Pow(1 + interestRate, years);
}

这当然是基于复利的简单定义。您可以类似地计算现值的变化。

请注意使用decimal类型来保留基本10的准确性。它还允许使用Math.Pow

来获得小数时间长度

答案 2 :(得分:3)

visual basic库中有一个Financial类。 Financial.PV()应该为你做到这一点。

如果您不使用Visual Basic,您仍然可以使用其他语言从项目中引用该库并使用财务功能。

根据您的评论,您无法直接使用该库,Financial.Pv函数中的可视化基本源代码看起来像这样......

Public Shared Function PV(ByVal Rate As Double, ByVal NPer As Double, ByVal Pmt As Double, ByVal Optional FV As Double = 0, ByVal Optional Due As DueDate = 0) As Double
    Dim num As Double
    If (Rate = 0) Then
        Return (-FV - (Pmt * NPer))
    End If
    If (Due <> DueDate.EndOfPeriod) Then
        num = (1 + Rate)
    Else
        num = 1
    End If
    Dim x As Double = (1 + Rate)
    Dim num2 As Double = Math.Pow(x, NPer)
    Return (-(FV + ((Pmt * num) * ((num2 - 1) / Rate))) / num2)
End Function

答案 3 :(得分:2)

当心。你需要区分连续复合,例如

Pv = exp(-rt).Fv

并且离散地复合,例如

Pv = Fv.[(1 + r)^(-n)] 

(以上是年度付款)

这些将给出不同的答案,你需要知道使用哪一个。