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

dci*_*iso 2 javascript math excel jquery excel-formula

我在javascript中使用IRR函数来创建使用自己的IRR函数在excel中完成的计算.问题是我的很少,我不知道为什么.这是下面的代码.

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;
}
Run Code Online (Sandbox Code Playgroud)

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


期间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与我正在使用的数字相同.

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

UPDATE

我通过更改下面的值来解决它.但现在表现太慢了.关于如何改进这个的任何想法?

IRRCalc(IRRval, 0.001)

//to

IRRCalc(IRRval, 0.0001)

inc = 0.000001;

//to

inc = 0.00000001;
Run Code Online (Sandbox Code Playgroud)

Zoh*_*aib 7

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

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果要重现也返回负值的 Excels IRR 函数,请设置 min = -1.0;为我工作。 (2认同)

whi*_*yit 6

快速浏览代码后,错误似乎与浮点精度错误有关.更多信息可以在这里找到: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;
Run Code Online (Sandbox Code Playgroud)

在我看来,成为问题.

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