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

2019-08-17 04:19发布

我使用的是IRR函数在JavaScript来创建在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是我使用了相同的数字。

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

UPDATE

我通过改变以下值解决它。 但现在的表现实在太缓慢。 任何想法如何改进呢?

IRRCalc(IRRval, 0.001)

//to

IRRCalc(IRRval, 0.0001)

inc = 0.000001;

//to

inc = 0.00000001;

Answer 1:

快速脱脂通过您的代码读出后,错误似乎与浮点精度误差 。 更多信息可以在这里找到: 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;

在我看来,是问题。

要解决这一点的方法是使用整数。 因此,而不是0.000001你可以使用1和,而不是0.001你可以使用1000然后为100000mPa将您的返回结果



Answer 2:

我们修改了代码来实现性能和精度。 试试这个:

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;
}


Answer 3:

这是一个浮点问题是肯定的。 你会想使用图书馆像BigDecimal.js来处理你的价值观。 这真是以避免此问题的唯一途径。



Answer 4:

试试这个。

function NPV(discountRate, cashFlow){
    var npv = 0;
    for(var t = 0; t < cashFlow.length; t++) {
        npv += cashFlow[t] / Math.pow((1+ discountRate),t);
    }
    return npv;
}


function IRR(cashFlow,guess){
    guess = guess ? guess : 0.1;
    var npv;
    var cnt = 0;
    do
    {
        npv = NPV(guess,cashFlow);
        guess+= 0.001;

        cnt++;
    }
    while(npv > 0)

    return guess;
}


Answer 5:

我想从@Zohaib答案基础上,但我想这样做是显示未定义在适当情况下。 我能做的最好的是得到它等于零。 我使用这个简单的数据集irr_arr=[-100, 100, 100, 100, 100,100] 我希望得到一些建议。

//IRRCALC funtion that handles irr going to infinity 

function IRRCalc_test(CArray) {

  min = 0.0;
  max = 1.0;
  c=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;
      c++; 
    }
    else {
      max = guest;
      c++;
    }

    if(c>=15){ return guest*100; }
  } while(Math.abs(NPV) > 0.000001);
  return guest*100;
}


// some testing 

irr_arr=[-100, 100, 100, 100, 100,100]
irr_res_arr_expected=[0,0,61.8,83.93,92.76,96.6]
for(i=1;i<=irr_arr.length;i++){
console.log("irr_arr - ",irr_arr.slice(0,i));
console.log("IRRCalc - ",IRRCalc(irr_arr.slice(0,i)))
//console.log("irr_expected - ", irr_res_arr_expected[i-1])
//if(IRRCalc(irr_arr.slice(0,i))===parseFloat(irr_res_arr_expected[i-1]).toFixed(2)){console.log(i,"- TRUE")} else {console.log(i,"- FALSE")}
}

这是输出

irr_arr -  [-100]
IRRCalc -  0.00      <<<<<<<<<<<<<<<<<<<------- this should be 'undefined' and not 'zero'
irr_arr -  [-100, 100]
IRRCalc -  0.00
irr_arr -  [-100, 100, 100]
IRRCalc -  61.80
irr_arr -  [-100, 100, 100, 100]
IRRCalc -  83.93
irr_arr -  [-100, 100, 100, 100, 100]
IRRCalc -  92.76
irr_arr -  [-100, 100, 100, 100, 100, 100]
IRRCalc -  96.60

这里是什么,我想制作的Excel



Answer 6:

不要将你的回报率最小为0。这就是界定你的答案。 尝试允许它去负。 也不要试图在一个数量calc下的内部收益率。



文章来源: Javascript IRR (Internal rate of return) Formula Accuracy