等额本息还款方式在生活中是很常用的,比如贷款买房,买车,信用卡分期还款,京东白条分期 ,等等,只要是借了钱,每月还款金额一样的,都属于等额本息的方式。有些时候我们贷款后,商家或银行告诉了每期的还款额,要算总还款是很简单(每期还款*期数),计算部利息也很容易(总还款-本金),但要计算年化利率就比较复杂了,年化利率还是一个比较重要的参数,它可更直观反应这次贷款的利率高低。本期给出计算方法及java代码实现,以及一些计算的例子:
计算方法:
假设:
贷款为B (本金)
期数为N
每期还款M
年化费率为X
则:
第一期还款(第一期还本金+第一期利息)M=B1 + B*X/12 //第一期的利息就是总本金B一个月的利息,就是年化费率除以12再乘以总本金(就是月费率乘以本金);
第二期还款(第二期还本金+第二期利息)M=B2 + (B-B1)*X/12 //第二期开始本金减少了,所以计算利息要减去已还的本金
第三期还款(第三期还本金+第三期利息)M=B3 + (B-B1-B2)*X/12
。。。
第N期还款(第N期还本金+第N期利息)M=Bn + (B-B1-B2-...-Bn-1)*X/12
构成一个方程组
M=B1 + B*X/12
M=B2 + (B-B1)*X/12
M=B3 + (B-B1-B2)*X/12
。。。
M=Bn + (B-B1-B2-...-Bn-1)*X/12
B=B1+B2+...+Bn
解方程组就可以得出年利率X;
java代码实现如下:使用了二分法来计算(使用二分法,相对于指数或对数的计算要快很多)
public class RateCalculator{
public static void main(String[] args) {
if (args.length < 3) {
System.out.println("至少输入3个参数(贷款金额 还款期数 每月还款)!");
return;
}
double Loan = Double.parseDouble(args[0]); //贷款金额(元)
int months = Integer.parseInt(args[1]); //还款期数(月)
double monthPay = Double.parseDouble(args[2]); //每月还款(元)
double yearRate = rateCalculator(Loan,months,monthPay); //年化利率(%)
System.out.println("贷款金额:" + Loan);
System.out.println("还款期数:" + months);
System.out.println("每月还款:" + monthPay);
System.out.println("年化利率:" + String.format("%.2f", yearRate) + "%");
}
/**
* 等额本息:已知每月还款额,计算年利率.
*
* @param totalLoan 贷款总额(单位:元)
* @param months 贷款期数(月数)
* @param monthPay 每月还款额(元)
* @return 年利率(%)
*/
public static double rateCalculator(double totalLoan, int months, double monthPay) {
double monthRate; //月利率
double[] monthPayLoan = new double[months]; //每期还的本金
/*本算法采用二分法穷举第一月的还款本金来计算每月还款本金,计算出还的本金就可以得到月利率
*/
double low = 0;
double up = totalLoan/months;
boolean isFinish = false;
int j=0;
do {
monthPayLoan[0] = (low+up)/2;
monthRate = (monthPay - monthPayLoan[0]) / totalLoan;
double havePayLoan = 0;
double calculateLoan = monthPayLoan[0];
for(int i=1; i<months; i++){
havePayLoan += monthPayLoan[i-1];
monthPayLoan[i] = monthPay-(totalLoan-havePayLoan)*monthRate;
calculateLoan += monthPayLoan[i];
}
long calculate = Math.round(calculateLoan);
long total = Math.round(totalLoan);
if(calculate == total) {
isFinish = true;
} else if (calculate > total) {
up = monthPayLoan[0];
} else {
low = monthPayLoan[0];
}
if(++j>30){
isFinish = true;
monthRate = -1;
}
} while(!isFinish);
return monthRate*12*100;
}
}
验证算法的准确性,在网上找一个房贷计算器,计算一次房贷款:
如上,贷款100000,分24期,利率4.75%,每期还款4375.95
通过本算法反向计算出的年利率是4.75%是准确 的。
以下是一些实际的例子:
1,特期拉model3分期付款:
特期拉页面上的年化费率是不准确的,参考上期文章分析:
https://blog.csdn.net/zucheng10/article/details/108144693
实际计算结果为:
2,某购物网站的分期付款:iphone 11 max , 分24期:
3,某信用卡现金分期
可以看出信用卡的分期的年化利率还是比较高的。