百度找了半天没有找到相应的东西,逼着我翻墙干谷歌。。。
直接上代码:
public static void main(String[] args) {
double rate = rate(24, 500, -10000, 100, 1);
System.out.println(rate);
}
private static final double FINANCIAL_PRECISION = 0.00000001; // 1.0e-08*
private static final double FINANCIAL_MAX_ITERATIONS = 128;
public static double rate(double npr, double pmt, double pv, double fv, int type) {
double rate = 0.1;
double y;
double f = 0.0;
if (Math.abs(rate) < FINANCIAL_PRECISION) {
y = pv * (1 + npr * rate) + pmt * (1 + rate * type) * npr + fv;
} else {
f = Math.exp(npr * Math.log(1 + rate));
y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
}
double y0 = pv + pmt * npr + fv;
double y1 = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
int i = 0;
double x0 = 0.0;
double x1 = rate;
while ((Math.abs(y0 - y1) > FINANCIAL_PRECISION) && (i < FINANCIAL_MAX_ITERATIONS)) {
rate = (y1 * x0 - y0 * x1) / (y1 - y0);
x0 = x1;
x1 = rate;
if (Math.abs(rate) < FINANCIAL_PRECISION) {
y = pv * (1 + npr * rate) + pmt * (1 + rate * type) * npr + fv;
} else {
f = Math.exp(npr * Math.log(1 + rate));
y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
}
y0 = y1;
y1 = y;
i++;
}
return rate;
}
输出结果:
0.017183572862842524
在Execl执行的结果是
0.017184
搞定收工!