Java版 IRR计算工具类
时间: 2023-06-30 12:21:23 浏览: 181
以下是一个Java版IRR计算工具类的示例代码:
```java
import org.apache.commons.math3.analysis.UnivariateFunction;
import org.apache.commons.math3.analysis.solvers.BrentSolver;
import org.apache.commons.math3.exception.TooManyIterationsException;
public class IRRCalculator {
/**
* 计算IRR
* @param cashFlows 现金流数组,第一个元素是负值,表示投资的现金流出;其余元素是正值,表示现金流入。
* @return IRR(内部收益率)
*/
public static double calculateIRR(double[] cashFlows) {
UnivariateFunction f = new UnivariateFunction() {
@Override
public double value(double x) {
double npv = 0.0;
for (int i = 0; i < cashFlows.length; i++) {
npv += cashFlows[i] / Math.pow(1 + x, i);
}
return npv;
}
};
BrentSolver solver = new BrentSolver();
solver.setAbsoluteAccuracy(1e-10);
solver.setMaximalIterationCount(1000);
try {
return solver.solve(f, -1.0, 1.0);
} catch (TooManyIterationsException e) {
return Double.NaN;
}
}
/**
* 测试
*/
public static void main(String[] args) {
double[] cashFlows = {-1000.0, 200.0, 250.0, 300.0, 350.0, 400.0, 450.0};
double irr = calculateIRR(cashFlows) * 100;
System.out.println("IRR: " + irr + "%");
}
}
```
在这个示例代码中,我们定义了一个静态方法`calculateIRR`,它接受一个现金流数组作为参数,并返回IRR。我们使用了Apache Commons Math库中的`UnivariateFunction`和`BrentSolver`来计算IRR,其中`UnivariateFunction`表示一元函数,`BrentSolver`表示一个非线性方程求解器。在`calculateIRR`方法中,我们首先定义了一个一元函数`f`,它根据输入的IRR计算现金流的净现值(NPV)。然后,我们使用`BrentSolver`来求解方程`f(x) = 0`,其中`x`就是IRR。最后,我们在`main`方法中使用示例数据来测试`calculateIRR`方法,计算出IRR并打印出来。
需要注意的是,在现实中,现金流一般是以年为单位计算的。如果现金流是以月、季度或其他时间间隔计算的,我们需要根据实际情况将其转换为年。
阅读全文