static int countnum=0;
public static double npv(double[] income, double i) {
double npv=0d;
for(int n=1;n<income.length+1;n++)
{
npv+=income[n-1]/Math.pow(1+i,n);
countnum++;
}
return npv;
}
public static double irr(double[] income,double guess) {
double accuracy=0.00001;
countnum=0;
int counp=10;
int accuracylen=0;
double acc=accuracy;
double npv=0;
for(double di=accuracy;di<1;di*=counp)
accuracylen+=1;
for(int i=accuracylen;i>0;i--)
{
acc=accuracy*Math.pow(10,i);
while(true){npv=npv(income,guess);if(npv>0)guess+=acc;if(npv<0){guess-=acc;break;}countnum++;}
}
while(true)
{
guess=guess+accuracy;
npv=Math.ceil(npv(income,guess)*100);
if(npv==0)break;countnum++;
}
return guess;
}
public static void main(String[] args) {
double i=0.08d;
double[] income = {-100,-200,300,500,700,500,700,500,700,500,700,-500,-700,500,700,500,700-100,-200,300,500,700,500,700,500,700,500,700,-500,-700,500,700,500,700};
for(int ic=100;ic>0;ic--)
System.out.println(irr(income,i)*100+"%");
System.out.println(countnum);
}