在Objective-C中以编程方式计算内部收益率(IRR)和NPV

我正在开发一个财务应用程序,需要IRR (in-built functionality of Excel)计算,并在C 这里find这样的伟大的教程,并在C#这样的答案在这里 。

我实现了上面C语言的代码,但是当内部收益率是正值时,它会给出一个完美的结果。 它应该是没有返回一个负值。 而在Excel =IRR(values,guessrate)返回负IRR以及一些值。

我在上面的C#链接中也提到了代码,它似乎遵循了很好的过程并返回错误,也希望它也返回负IRR,就像Excel一样。 但我不熟悉C#,所以我不能在Objective-C或C中实现相同的代码。

我正在编写从上面的链接,我已经实施帮助你们的C代码。

 #define LOW_RATE 0.01 #define HIGH_RATE 0.5 #define MAX_ITERATION 1000 #define PRECISION_REQ 0.00000001 double computeIRR(double cf[], int numOfFlows) { int i = 0, j = 0; double m = 0.0; double old = 0.00; double new = 0.00; double oldguessRate = LOW_RATE; double newguessRate = LOW_RATE; double guessRate = LOW_RATE; double lowGuessRate = LOW_RATE; double highGuessRate = HIGH_RATE; double npv = 0.0; double denom = 0.0; for (i=0; i<MAX_ITERATION; i++) { npv = 0.00; for (j=0; j<numOfFlows; j++) { denom = pow((1 + guessRate),j); npv = npv + (cf[j]/denom); } /* Stop checking once the required precision is achieved */ if ((npv > 0) && (npv < PRECISION_REQ)) break; if (old == 0) old = npv; else old = new; new = npv; if (i > 0) { if (old < new) { if (old < 0 && new < 0) highGuessRate = newguessRate; else lowGuessRate = newguessRate; } else { if (old > 0 && new > 0) lowGuessRate = newguessRate; else highGuessRate = newguessRate; } } oldguessRate = guessRate; guessRate = (lowGuessRate + highGuessRate) / 2; newguessRate = guessRate; } return guessRate; } 

我附加了Excel和上面的C语言代码中不同的值的结果。

  Values: Output of Excel: -33.5% 1 = -18.5, Output of C code: 0.010 or say (1.0%) 2 = -18.5, 3 = -18.5, 4 = -18.5, 5 = -18.5, 6 = 32.0 Guess rate: 0.1 

由于low_rate和high_rate都是正数,所以你不能得到负分数。 你必须改变:

 #define LOW_RATE 0.01 

例如,

 #define LOW_RATE -0.5