现值 是未来付款或一系列未来付款在给定日期的价值,贴现以反映货币时间价值和其他因素,如投资风险。是的,我知道这是公式,所以不需要。
但我想知道这个方法是否已经在 .NET 库中预定义。我找不到它。(我猜 .NET 不包含这个函数,所以我只需要使用我自己的函数。)
我没有使用任何用 C# 编写的好的第三方组件或示例。我必须使用一些允许任何标准 .NET 库的第三方脚本解决方案。我可以添加对第三方库的自定义引用,甚至编写自己的附加模块,但我试图避免这种情况。
现值 是未来付款或一系列未来付款在给定日期的价值,贴现以反映货币时间价值和其他因素,如投资风险。是的,我知道这是公式,所以不需要。
但我想知道这个方法是否已经在 .NET 库中预定义。我找不到它。(我猜 .NET 不包含这个函数,所以我只需要使用我自己的函数。)
我没有使用任何用 C# 编写的好的第三方组件或示例。我必须使用一些允许任何标准 .NET 库的第三方脚本解决方案。我可以添加对第三方库的自定义引用,甚至编写自己的附加模块,但我试图避免这种情况。
也就是说,在类型Microsoft.VisualBasic.Financial, Microsoft.VisualBasic.dll
中,静态PV
函数计算现值。
同样值得注意的是在 F# 中实现的Excel 财务函数。此 API 可以选择在没有任何 F# 设计或运行时组件的情况下使用。
您可以使用该Microsoft.VisualBasic
库,但这对我来说似乎不是一个非常优雅的解决方案。如果它在未来被弃用,我不会感到惊讶。
一个简单的扩展将是一个很好的解决方案:
public decimal PresentValue(this decimal value, decimal interestRate,
decimal years)
{
return value / Math.Pow(1 + interestRate, years);
}
这当然是基于复利的简单定义。您可以类似地计算现值的变化。
请注意使用decimal
类型来保持以 10 为底的精度。它还允许使用Math.Pow
.
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
谨防。您需要区分连续复利,例如
Pv = exp(-rt).Fv
和离散复合,例如
Pv = Fv.[(1 + r)^(-n)]
(以上为年费)
这些将给出不同的答案,您需要知道使用哪一个。