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;
	}

}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值