`
raymond.chen
  • 浏览: 1419543 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

等额本息还款

 
阅读更多

等额本息法:每月的还款额相同,从本质上来说是本金所占比例逐月递增,利息所占比例逐月递减,月还款数不变,即在月供“本金与利息”的分配比例中,前半段时期所还的利息比例大、本金比例小,还款期限过半后逐步转为本金比例大、利息比例小。

 

/**
	 * 等额本息还款法
	 * @param _loanAmount 贷款金额(元)
	 * @param _loanYears 贷款年数
	 * @param _annualInterestRate 贷款年利率(%)
	 */
	private static void averageCapitalPlusInterest(double _loanAmount, int _loanYears, double _annualInterestRate){
		BigDecimal digit_0 = new BigDecimal(0); //数字0
		BigDecimal digit_1 = new BigDecimal(1); //数字1
		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));
		
		//每月还款额 = [贷款本金×月利率×(1+月利率)^还款月数] ÷ [(1+月利率)^还款月数 - 1]
		BigDecimal bx1 = loanTotal.multiply(monthlyInterestRate).multiply(digit_1.add(monthlyInterestRate).pow(loanMonths));
		BigDecimal bx2 = digit_1.add(monthlyInterestRate).pow(loanMonths).subtract(digit_1);
		BigDecimal monthlyRepaymentAmount = bx1.divide(bx2, scale, BigDecimal.ROUND_HALF_UP);
		System.out.println("每月还款额:" + toFixed(monthlyRepaymentAmount, 2));
		
		//总利息
		BigDecimal totalInterest = digit_0;
		
		//剩余本金
		BigDecimal remainingPrincipal = loanTotal;
		
		System.out.println("\n期数,还款本息(元),还款利息(元),还款本金(元),剩余本金(元)");
		for(int n=1; n<=loanMonths; n++){
			//每月还贷本金 B = a*i*(1+i)^(n-1) / [(1+i)^N-1]
			//B=等额本息月还本金,a=贷款总金额, i=贷款月利率,n=第n期还贷数,N=还贷总月数
			BigDecimal bj = loanTotal.multiply(monthlyInterestRate).multiply(digit_1.add(monthlyInterestRate).pow(n-1));
			bj = bj.divide(digit_1.add(monthlyInterestRate).pow(loanMonths).subtract(digit_1), scale, BigDecimal.ROUND_HALF_UP);

			//利息 = 剩余本金 * 月利率
			BigDecimal lx = remainingPrincipal.multiply(monthlyInterestRate);

			//剩余本金
			remainingPrincipal = remainingPrincipal.subtract(bj);
			
			//总利息
			totalInterest = totalInterest.add(lx);
			System.out.println( n + "," + toFixed(monthlyRepaymentAmount, 2) + "," + toFixed(lx, 2) + "," + toFixed(bj, 2) + "," + toFixed(remainingPrincipal,2) );
		}
		
		System.out.println("总利息:" + toFixed(totalInterest, 2));
		System.out.println("还款总金额:" + toFixed(loanTotal.add(totalInterest), 2));
	}
	
	/**
	 * 四舍五入
	 * @param value 数值
	 * @param scale 精度:保留几位小数点
	 */
	private static BigDecimal toFixed(BigDecimal value, int scale){
		return value.divide(new BigDecimal(1), scale, BigDecimal.ROUND_HALF_UP);
	}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics