I’m using a IRR function in javascript to create calculation a that is done in excel using its own IRR function. The problem is mine is little off and I have no idea why. Here’s the code below.
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; }
Now if you use these figures:
Period 24
Financed 22000
Rental 1017.5000
My Result is: 0.008523000000000175
Excel Result is: 0.008522918
OR
Period 42
Financed 218000
Rental 5917.1429
My Result is: 0.006247000000000489
Excel Result is: 0.00624616
The Excel function is called: =IRR(T12:T73,0.01)
T12-T73 is the same figures I’m using.
Any help would be much appreciated, Thanks Jason
UPDATE
I’ve solved it by changing the values below. But now the performance is too slow. Any ideas on how to improve this?
IRRCalc(IRRval, 0.001) //to IRRCalc(IRRval, 0.0001) inc = 0.000001; //to inc = 0.00000001;
Advertisement
Answer
After a quick skim read through your code, the error seems to be related to floating point precision error. More information can be found here: http://ajaxian.com/archives/crock-on-floating-points-in-javascript
In older javascript engines, if you did 0.3 + 0.3 you get something like 0.600000000001
Though most javascript engines today return 0.6, under the hood, the problem remains. Adding floats together causes unexpected results. So in your case the
inc = 0.000001; guest += inc;
seems to me, to be the problem.
A way to solve this would be to use whole numbers. So instead of 0.000001 you would use 1 and instead of 0.001 you would use 1000. Then divide your return result by 100000