我无法计算IRR。我是Microsoft.VisualBasic来计算IRR的。以下是一个案例:
using Microsoft.VisualBasic;
...
static void Main(string[] args)
{
double[] tmpCashflows = new double[] {
-480117.0,
4471.5158140594149,
6841.5950239895265,
6550.383550359461,
6295.8611873818609,
6074.6070899770129,
5883.532880960287,
6006.9907860976427,
6133.1633945923877
,6262.1156759885489
//,6393.9143799520116
};
decimal irr = 0;
try
{
double tmpIrr = Financial.IRR(ref tmpCashflows);
...
}
catch (Exception ex)
{
irr = 0;
}
}它给出了“参数无效”类型的例外(在Microsoft.VisualBasic.Financial.IRR(Double[]& ValueArray,双重猜测))。但是,如果我在Excel中进行计算,则不会显示任何错误。
发布于 2014-04-04 09:16:27
您需要提供一个很好的猜测值作为这个API的第二个参数。对于输入,默认值0.1失败。
试试这个:
double tmpIrr = Financial.IRR(ref tmpCashflows, 0.3);你应该拿回一个IRR of -0.2987
它看起来像API只处理输入的特定情况,并且在其他情况下失败,无论猜测如何。这是微软承认的IRR。
如果猜测成为一个问题,最好使用第三方可靠库计算IRR。
http://connect.microsoft.com/VisualStudio/feedback/details/781299/microsoft-visualbasic-financial-irr-doesnt-solve-for-irr-correctly-in-certain-cases-with-any-guess
获得Argument is not valid异常的原因是无法计算默认猜测值0.1的IRR。请注意,给定的值满足一个负值(支付)和一个正值的条件。(收据)
在内部,**Microsoft.VisualBasic.Financial.IRR**遍历输入值并尝试计算超过40次迭代的IRR。它从未遇到有效IRR的破坏条件,因此最终抛出此错误。
请注意,Excel提供的值为-30%。
同时,为类似的数组尝试IRR
tmpCashflows = new double[] { -100, 200, 300 };
double tmpIrr = Microsoft.VisualBasic.Financial.IRR(ref tmpCashflows);给出的IRR为2.0或200%。(通过代码和Excel)
发布于 2019-06-11 13:23:50
public static class Interpolation
{
public static double IRR(this Dictionary<double, double> cashFlow) //term in years, amount
{
int count = 0;
double r1=0.1d, r2=0.05d, v1, v2, r = 0, v;
v1 = cashFlow.DiscountedValue(r1);
v2 = cashFlow.DiscountedValue(r2);
while (Math.Abs(v2 - v1) > .001 && count < 1000)
{
count++;
r = (0 - v1) / (v1-v2) * (r1 - r2) + r1;
v = cashFlow.DiscountedValue(r);
v1 = v2;
r1 = r2;
v2 = v;
r2 = r;
}
if (count == 1000) return -1;
return r;
}
public static double DiscountedValue(this Dictionary<double, double> cashFlow, double rate)
{
double dv = 0d;
for (int i = 0; i < cashFlow.Count; i++)
{
var element = cashFlow.ElementAt(i);
dv += element.Value * Math.Pow(1 + rate, -(element.Key));
}
return dv;
}
}https://stackoverflow.com/questions/22857597
复制相似问题