Javascript IRR(内部收益率)公式准确性

新手上路,请多包涵

我在 javascript 中使用 IRR 函数来创建计算 a,这是在 excel 中使用它自己的 IRR 函数完成的。问题是我的有点不正常,我不知道为什么。这是下面的代码。

 var IRRval = [];

IRRval.push(-financed);
for (i = 0; i < period; i++) {
    IRRval.push(rental);
}

var IRR = IRRCalc(IRRval, 0.001) * 0.01;

function IRRCalc(CArray, guest) {
    inc = 0.000001;
    do {
        guest += inc;
        NPV = 0;
        for (var j=0; j < CArray.length; j++) {
            NPV += CArray[j] / Math.pow((1 + guest), j);
        }
    } while (NPV > 0);
    return guest * 100;
}

现在,如果您使用这些数字:


第 24 期

融资22000

租金 1017.5000

我的结果是:0.008523000000000175

Excel 结果是:0.008522918


或者


第 42 期

融资218000

出租 5917.1429

我的结果是:0.006247000000000489

Excel 结果是:0.00624616


Excel 函数称为: =IRR(T12:T73,0.01) T12-T73 与我使用的数字相同。

任何帮助将不胜感激,谢谢杰森

更新

我已经通过更改以下值解决了它。但是现在性能太慢了。关于如何改进这个的任何想法?

 IRRCalc(IRRval, 0.001)

//to

IRRCalc(IRRval, 0.0001)

inc = 0.000001;

//to

inc = 0.00000001;

原文由 dciso 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

快速浏览您的代码后,错误似乎与 floating point precision error 有关。更多信息可以在这里找到:http: //ajaxian.com/archives/crock-on-floating-points-in-javascript

在旧的 javascript 引擎中,如果你执行 0.3 + 0.3 你会得到类似 0.600000000001 的结果

虽然现在大多数 javascript 引擎都返回 0.6,但在引擎盖下,问题仍然存在。将浮点数加在一起会导致意想不到的结果。所以在你的情况下

inc = 0.000001;
guest += inc;

在我看来,这是问题所在。

解决这个问题的一种方法是使用整数。因此,您将使用 1 而不是 0.000001 而不是 0.001,您将使用 1000。然后将返回结果除以 100000

原文由 whitneyit 发布,翻译遵循 CC BY-SA 3.0 许可协议

我们修改了代码以实现性能和准确性。尝试这个:

 function IRRCalc(CArray) {

  min = 0.0;
  max = 1.0;
  do {
    guest = (min + max) / 2;
    NPV = 0;
    for (var j=0; j<CArray.length; j++) {
          NPV += CArray[j]/Math.pow((1+guest),j);
    }
    if (NPV > 0) {
      min = guest;
    }
    else {
      max = guest;
    }
  } while(Math.abs(NPV) > 0.000001);
  return guest * 100;
}

原文由 Zohaib 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题