[转]Java务实际利率之Excel函数RATE
[转]Java求实际利率之Excel函数RATE
Excel
Java
C
C++
C#
在excel里有个函数RATE是求实际利率的,在网上搜罗了半年,公式倒是找到不少,可以没有一个实现的算法,郁闷,自己研究,写一个出来,做个备忘
公式:
上面的太复杂,来个简单的:
使用JAVA求实际利率
- /**
- * 实际利率法
- * @author Bean(mailto:mailxbs@126.com)
- * @param a 现值
- * @param b 年金
- * @param c 期数
- * @param cnt 运算次数
- * @param ina 误差位数
- * @return 利率
- */
- public static double rate( double a, double b, double c, int cnt, int ina){
- double rate = 1 ,x,jd = 0.1 ,side = 0.1 ,i = 1 ;
- do {
- x = a/b - (Math.pow(1 +rate, c)- 1 )/(Math.pow(rate+ 1 , c)*rate);
- if (x*side> 0 ){side = -side;jd *= 10 ;}
- rate += side/jd;
- }while (i++<cnt&&Math.abs(x)>= 1 /Math.pow( 10 , ina));
- if (i>cnt) return Double.NaN;
- return rate;
- }
- public static void main(String agrs[]) {
- {
- Double 现值 = 7944760 .00d;
- Double 年金 = 186627 .21d;
- Double 期数 = 48d;
- //计算200次,比Excel20次要精确,误差精确到小数点后10位
- System.out.println(rate(现值,年金,期数,200 , 10 ));
- }
- }
/** * 实际利率法 * @author Bean(mailto:mailxbs@126.com) * @param a 现值 * @param b 年金 * @param c 期数 * @param cnt 运算次数 * @param ina 误差位数 * @return 利率 */ public static double rate(double a,double b,double c,int cnt,int ina){ double rate = 1,x,jd = 0.1,side = 0.1,i = 1; do{ x = a/b - (Math.pow(1+rate, c)-1)/(Math.pow(rate+1, c)*rate); if(x*side>0){side = -side;jd *=10;} rate += side/jd; }while(i++<cnt&&Math.abs(x)>=1/Math.pow(10, ina)); if(i>cnt)return Double.NaN; return rate; } public static void main(String agrs[]) { { Double 现值 = 7944760.00d; Double 年金 = 186627.21d; Double 期数 = 48d; //计算200次,比Excel20次要精确,误差精确到小数点后10位 System.out.println(rate(现值,年金,期数,200,10)); } }
计算输出0.00501013209570014,与Excel的0.00501013309186311很接近了,偷乐一下