java实现excel IRR算法


import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class IrrUtil {
	private double MINDIF = 0.001;

	private int LOOPNUM = 2000;

	private static int period = 0;  

	@SuppressWarnings("rawtypes")
	private List netCash = new ArrayList();  

	
	public static void main(String[] args) {
		List list = new ArrayList();
		list.add(-76694086.73);
		list.add(9184579.93 );
		list.add(9184579.93 );
		list.add(9184579.93 );
		list.add(9184579.93 );
		list.add(9184579.93 );
		list.add(9184579.93 );
		list.add(9184579.93 );
		list.add(9184579.93 );
		list.add(9184579.93 );
		list.add(9184579.93 );
		list.add(184579.93 );
		
		IrrUtil  aa = new IrrUtil(list,12);
		System.out.println(aa.calculator());
	}
	@SuppressWarnings("rawtypes")
	public IrrUtil(List netCashArr, int interval) {
		super();
		netCash = netCashArr;
		period = 12/interval;
	}

	private double NPV(double r) {

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

	public double calculator() {

		double irr = 0;
		double r1 = new BigDecimal("0.1").doubleValue();
		double r2 = new BigDecimal("0.09").doubleValue();
		double npv1 = NPV(r1);
		double npv2 = NPV(r2);
		//System.out.println(netCash+"--");
		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);
			count++;
			// System.out.println(count+"--");
		}
		// System.out.println(irr*period+"--");
		if (Math.abs(npv2) < MINDIF & count <= LOOPNUM)

			//return irr * period ;
			return irr;
		else
			return Double.NaN;
	}
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
IRRR(Internal Rate of Return Recursive)算法是一种计算投资回报率的方法。在Java实现IRR算法可以使用迭代法或者二分法,下面是一个使用迭代法实现IRR算法的示例代码: ```java public class IRRAlgorithm { private static final double EPSILON = 0.00001; // 定义精度 public static double calculateIRR(double[] cashFlows) { double irr = 0.1; // 初始IRR值,可以根据实际情况进行调整 while (true) { double npv = calculateNPV(cashFlows, irr); double derivative = calculateDerivative(cashFlows, irr); double newIRR = irr - npv / derivative; // 根据迭代公式计算新的IRR值 if (Math.abs(newIRR - irr) < EPSILON) { return newIRR; } irr = newIRR; } } private static double calculateNPV(double[] cashFlows, double rate) { double npv = 0; for (int i = 0; i < cashFlows.length; i++) { npv += cashFlows[i] / Math.pow(1 + rate, i + 1); } return npv; } private static double calculateDerivative(double[] cashFlows, double rate) { double derivative = 0; for (int i = 0; i < cashFlows.length; i++) { derivative -= (i + 1) * cashFlows[i] / Math.pow(1 + rate, i + 2); } return derivative; } public static void main(String[] args) { double[] cashFlows = {-100, 50, 40, 30}; // 这里假设有一个投资项目,初始投资为-100,后续收益为50, 40, 30 double irr = calculateIRR(cashFlows); System.out.println("IRR: " + irr); } } ``` 以上代码通过迭代法计算给定现金流的IRR值。在`calculateIRR`方法中,通过不断迭代计算新的IRR值,直到新旧IRR之间的差值小于设定的精度阈值(EPSILON),然后返回最终的IRR值。 在`calculateNPV`方法中,计算现金流的净现值(Net Present Value,NPV),通过将每个现金流按照时间加权求和的方式计算得到。 在`calculateDerivative`方法中,计算IRR对于NPV的导数,用于迭代过程中更新IRR值。 最后,在`main`方法中定义了一个示例现金流数组`cashFlows`,并调用`calculateIRR`方法计算并输出IRR值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值