等额本息还款方式的年利率计算方法及java代码实现

等额本息还款方式在生活中是很常用的,比如贷款买房,买车,信用卡分期还款,京东白条分期 ,等等,只要是借了钱,每月还款金额一样的,都属于等额本息的方式。有些时候我们贷款后,商家或银行告诉了每期的还款额,要算总还款是很简单(每期还款*期数),计算部利息也很容易(总还款-本金),但要计算年化利率就比较复杂了,年化利率还是一个比较重要的参数,它可更直观反应这次贷款的利率高低。本期给出计算方法及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,某信用卡现金分期

 

可以看出信用卡的分期的年化利率还是比较高的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值