package com.fr.function; import java.math.BigDecimal; import com.fr.general.FArray; import com.fr.general.GeneralUtils; import com.fr.script.AbstractFunction; public class IRR extends AbstractFunction { private static final long serialVersionUID = 7634415917398642321L; private static final String ERROR_VALUE = "#NUM!"; @Override public Object run(Object[] args) { try{ if(1 == args.length){ return run( transArr( (FArray) args[0] ) ); }else if(2 == args.length){ return run( transArr( (FArray) args[0] ), trans( args[1] ) ); } }catch(Exception e){ System.out.println(e); } return ERROR_VALUE; } /** * 将其他类型的数字转换为大数(保证精度) * @param ele * @return */ private static BigDecimal trans(Object ele){ try{ String val = GeneralUtils.objectToString(ele); return new BigDecimal(val); }catch(Exception e){ } return (BigDecimal) ele; } /** * 将数组转换为大数数组 * @param in * @return */ private static FArray transArr(FArray in){ FArray rt = new FArray(); for(int i=0;i cashflow){ return run( cashflow, new BigDecimal(0.1d) ); } private static BigDecimal run(FArray cashflow,BigDecimal guess){ BigDecimal maxrate = initRateMax(cashflow,guess); BigDecimal minrate = initRateMin(cashflow,guess); for( int i=0; i cashflow,BigDecimal guess){ for( int i=0; i cashflow,BigDecimal guess){ for( int i=0; i cashflow,BigDecimal rate){ BigDecimal npv = ZERO; BigDecimal rpowj = ONE;//(1+r)^0 BigDecimal radd1 = rate.add(ONE);//1+r for( int j=0; j