等额本息是指一种贷款的还款方式,指在还款期内,每月偿还同等数额的贷款(包括本金和利息)。
这种算法较等额本金来说,还是有点儿复杂的,等额本金虽然每月还款都不一样,但是算法简单,因为每月的本金都是相同的,只需要在本金的基础上加上剩余应还在当月产生的利息就可以了。但是等额本息不一样,虽然每月还款额都一样,但是组成的部分不一样,前期还款利息占比较多,到后期利息占比较少,每期的本金加利息的总额是相等的。
等额本息的计算公式可以轻松地在网上查到,那么这个公式是怎么推导出来的呢?我们就来试着推导一下。
本金为a,利率为b,分n期。设每月还款为x
第一期还款后的剩余应还表示如下:
第二期还款后的剩余应还
第三期还款后的剩余应还
依次类推第n期还款后的剩余应还
利用等比数列的求和公式,可对后半部分进行归纳
等比数列的求和公式:
在本式中,x为首项,(1+b)为公比,代入公式
最后一期还款之后的剩余应还应该是0,所以上面的表达式的值是0
这就是等额本息计算公式的推导过程。
那么如果我想知道每月还款的明细(本金和利息各还多少)该怎么做呢,我觉得应该也可以通过数学的方法算出来,奈何我不会,只能通过程序来遍历出来。
因为无论是等额本金还是等额本息,第一个月的利息是一样的,即全部贷款金额产生的利息,那么在前面已经推导出了等额本息的计算公式,每月的还款额可以得知,那么将还款额减去首月的利息就是首月还款的本金,知道了首月还款本金就可以算出来下一个月还款的利息,依次类推,代码如下:
public static void calc2(double amount, double rate, int periods) {
double monthRate = rate / 12;
double retu = amount * (monthRate * Math.pow(1 + monthRate, periods))/ (Math.pow(1 + monthRate, periods) - 1);
System.out.println("每月还" + retu + ",一共还" + retu * periods);
//计算每月还款详情
double rest_amount = amount;
for(int i = 0;i<periods;i++){
double instered = rest_amount * monthRate;
double this_amount = retu - instered;
rest_amount -= this_amount;
System.out.println("第" + (i + 1) + "期:\t应还本金\t" + this_amount + "\t应付利息\t"
+ instered + "\t本金+利息\t" + (this_amount+instered) + "\t剩余应还\t" + rest_amount);
}
}
这样每个月的还款详情就可以借助程序算出来了