2

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

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

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

4

4 回答 4

4

也就是说,在类型Microsoft.VisualBasic.Financial, Microsoft.VisualBasic.dll中,静态PV函数计算现值。

同样值得注意的是在 F# 中实现的Excel 财务函数。此 API 可以选择在没有任何 F# 设计或运行时组件的情况下使用。

于 2009-07-15T12:01:26.040 回答
4

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

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

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

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

请注意使用decimal类型来保持以 10 为底的精度。它还允许使用Math.Pow.

于 2009-07-15T12:11:56.877 回答
3

Visual Basic 库中有一个Financial类。 Financial.PV () 应该为您解决问题。

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

根据您不能直接使用该库的评论,Financial.Pv 函数中的 Visual Basic 源代码看起来像这样......

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
于 2009-07-15T11:59:48.137 回答
2

谨防。您需要区分连续复利,例如

Pv = exp(-rt).Fv

和离散复合,例如

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

(以上为年费)

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

于 2009-07-15T12:11:37.113 回答