java代码实现Excel irr计算

/**
 * 综合年利率工具类
 */
public class ComprehensiveAnnualRateUtil {
	
	/**
	 * 计算综合年利率
	 * 	计算公式 irr * loanTerm * 100 【100代表100%】
	 * @param list 【第一个元素为本金的负数,后面为每期应还金额(本金+利息)】
	 * @param loanTerm
	 * @return
	 */
	public static String calaulate(List<String> list, int loanTerm) {
		/**	计算公式 irr * 期数 * 100 【100代表100%】*/
		double irr = new BigDecimal(calculator(list, loanTerm)).multiply(new BigDecimal(loanTerm)).multiply(new BigDecimal("100")).doubleValue();
		DecimalFormat df = new DecimalFormat("0.00");
		return df.format(Math.abs(irr));
	}
	
	private static double NPV(double r, List<String> netCash) {
		 
		double npv = 0;
 
		if (netCash.size() != 0) {
			for (int count = 0; count < netCash.size(); count++) {
				npv += Double.valueOf(netCash.get(count).toString()) / Math.pow(1 + r, count);
			}
			return npv;
		}
		return Double.NaN;
	}
	
	/**
	 * IRR函数
	 * @author: wgc
	 * @date: 2021年4月30日 下午5:04:50 
	 * @param netCashArr
	 * @param interval
	 * @return
	 */
	private static double calculator(List<String> netCashArr, int interval) {
		
		double MINDIF = 0.001;
		 
		int LOOPNUM = 2000;
 
		double irr = 0;
		double r1 = new BigDecimal("0.1").doubleValue();
		double r2 = new BigDecimal("0.09").doubleValue();
		double npv1 = NPV(r1, netCashArr);
		double npv2 = NPV(r2, netCashArr);
		int count = 0;
		while (Math.abs(npv2) > MINDIF & count < LOOPNUM) {
			irr = r2 - npv2 * (r2 - r1) / (npv2 - npv1);
			r1 = r2;
			r2 = irr;
			npv1 = npv2;
			npv2 = NPV(r2, netCashArr);
			count++;
		}
		if (Math.abs(npv2) < MINDIF & count <= LOOPNUM)
			return irr;
		else
			return Double.NaN;
	}

}
上一篇:Windows server 2012 r2 无法安装 python-3.6.8-amd64.exe


下一篇:2021年R2移动式压力容器充装考试题及R2移动式压力容器充装免费试题