等额本金:每月的还款额不同,呈现逐月递减的状态;它是将贷款本金按还款的总月数均分,再加上上期剩余本金的利息,这样就形成月还款额,所以等额本金法第一个月的还款额最多,然后逐月减少,越还越少。
/**
* 等额本金还款法
* @param _loanAmount 贷款金额(元)
* @param _loanYears 贷款年数
* @param _annualInterestRate 贷款年利率(%)
*/
private static void averageCapital(double _loanAmount, int _loanYears, double _annualInterestRate){
BigDecimal digit_0 = new BigDecimal(0); //数字0
BigDecimal digit_100 = new BigDecimal(100); //数字100
BigDecimal monthsOfYear = new BigDecimal(12); //一年的月数
int scale = 10; //精度
BigDecimal loanTotal = new BigDecimal(_loanAmount); //贷款总额,元为单位
BigDecimal loanYears = new BigDecimal(_loanYears); //贷款年数
BigDecimal annualInterestRate = new BigDecimal(_annualInterestRate).divide(digit_100); //年利率
//还款月数
int loanMonths = loanYears.multiply(monthsOfYear).intValue();
System.out.println("还款月数:" + loanMonths);
//月利率 = 年利率 /12。一般以千分之表示
BigDecimal monthlyInterestRate = annualInterestRate.divide(monthsOfYear, scale, BigDecimal.ROUND_HALF_UP);
System.out.println("月利率:" + toFixed(monthlyInterestRate.multiply(new BigDecimal(1000)), 3));
//每月本金=总本金/还款月数
BigDecimal monthlyPrincipal = loanTotal.divide(new BigDecimal(loanMonths), scale, BigDecimal.ROUND_HALF_UP);
BigDecimal accruedPrincipal = digit_0; //累计本金
BigDecimal totalInterest = digit_0; //累计利息
System.out.println("\n期数,还款本息(元),还款利息(元),还款本金(元),剩余本金(元)");
for(int n=1; n<=loanMonths; n++){
//每月还款本息 =(本金/还款月数)+(本金-累计已还本金)×月利率
BigDecimal bx1 = loanTotal.divide(new BigDecimal(loanMonths), scale, BigDecimal.ROUND_HALF_UP);
BigDecimal bx2 = loanTotal.subtract(accruedPrincipal).multiply(monthlyInterestRate);
BigDecimal monthlyRepaymentAmount = bx1.add(bx2);
//每月利息 = (本金-累计已还本金)×月利率
BigDecimal lx = loanTotal.subtract(accruedPrincipal).multiply(monthlyInterestRate);
//总利息
totalInterest = totalInterest.add(lx);
//累计已还本金
accruedPrincipal = accruedPrincipal.add(monthlyPrincipal);
//剩余本金 = 本金-累计已还本金
BigDecimal remainingPrincipal = loanTotal.subtract(accruedPrincipal);
System.out.println(n + "," + toFixed(monthlyRepaymentAmount, 2) + "," + toFixed(lx, 2) + "," + toFixed(monthlyPrincipal, 2) + "," + toFixed(remainingPrincipal, 2));
}
System.out.println("总利息:" + toFixed(totalInterest, 2));
System.out.println("还款总金额:" + toFixed(loanTotal.add(totalInterest), 2));
}