Android 房贷计算

来源:互联网 发布:电视怎么弄成网络电视 编辑:程序博客网 时间:2024/04/29 00:51
package com.demo;


import java.math.BigDecimal;


/**
 * 描述:房贷计算公式(repayment method) 
 * 等额本息还款法:(average capital plus interest)
 * 每月月供额=〔贷款本金×月利率×(1+月利率)^还款月数〕÷〔(1+月利率)^还款月数-1〕
 * 每月应还利息=贷款本金×月利率×〔(1+月利率)^还款月数-(1+月利率)^(还款月序号-1)〕÷〔(1+月利率)^还款月数-1〕
 * 每月应还本金=贷款本金×月利率×(1+月利率)^(还款月序号-1)÷〔(1+月利率)^还款月数-1〕 总利息=还款月数×每月月供额-贷款本金
 * <p>
 * 等额本金还款法:(average capital ) 每月月供额=(贷款本金÷还款月数)+(贷款本金-已归还本金累计额)×月利率
 * 每月应还本金=贷款本金÷还款月数 
 * 每月应还利息=剩余本金×月利率=(贷款本金-已归还本金累计额)×月利率
 * 每月月供递减额=每月应还本金×月利率=贷款本金÷还款月数×月利率
 * 总利息=〔(总贷款额÷还款月数+总贷款额×月利率)+总贷款额÷还款月数×(1+月利率)〕÷2×还款月数-总贷款额 说明:月利率=年利率÷12
 * 15^4=15×15×15×15(15的4次方,即4个15相乘的意思)
 * <p>
 * 作者:Administrator on 2016/12/16 13:44 邮箱:androidit@yeah.net 
 * BigDecimal公式
 * BigDecimal add(BigDecimal augend)  加法运算
 * BigDecimal subtract(BigDecimal subtrahend)减法运算 
 * BigDecimal multiply(BigDecimal multiplicand)法运算 
 * BigDecimal divide(BigDecimal divisor) 除法运算
 */


public class RateUtils {

//等额本金 〔(总贷款额÷还款月数+总贷款额×月利率)+总贷款额÷还款月数×(1+月利率)〕÷2×还款月数-总贷款额
private BigDecimal computeDEBJTotalRate(BigDecimal monthlyPayment,BigDecimal mStrikeRate,Integer montyTotal){
BigDecimal montyNum = new BigDecimal(montyTotal);
BigDecimal strikeRate = mStrikeRate.divide(new BigDecimal(100 * 12), 6, BigDecimal.ROUND_HALF_UP);// 月利率,四舍五入精确到6位小数
BigDecimal benj = monthlyPayment.multiply(new BigDecimal("10000"));// 本金
BigDecimal rate1 = BigDecimal.ONE.add(strikeRate);// (1+月利率)

BigDecimal m1 = benj.divide(montyNum,6,BigDecimal.ROUND_HALF_UP);//总贷款额÷还款月数

BigDecimal m2 = benj.multiply(strikeRate);//总贷款额×月利率

BigDecimal m3 = m1.add(m2);//(总贷款额÷还款月数+总贷款额×月利率)

BigDecimal m4 = benj.divide(montyNum, 6, BigDecimal.ROUND_HALF_UP);//总贷款额÷还款月数

BigDecimal m5 = m4.multiply(rate1);//总贷款额÷还款月数×(1+月利率)

BigDecimal m6 = m3.add(m5);//〔(总贷款额÷还款月数+总贷款额×月利率)+总贷款额÷还款月数×(1+月利率)〕

BigDecimal m7 = m6.divide(new BigDecimal(2),6,BigDecimal.ROUND_HALF_UP);//〔(总贷款额÷还款月数+总贷款额×月利率)+总贷款额÷还款月数×(1+月利率)〕÷2

BigDecimal m8 = m7.multiply(montyNum);//〔(总贷款额÷还款月数+总贷款额×月利率)+总贷款额÷还款月数×(1+月利率)〕÷2×还款月数

BigDecimal m9 = m8.subtract(benj).setScale(2);//〔(总贷款额÷还款月数+总贷款额×月利率)+总贷款额÷还款月数×(1+月利率)〕÷2×还款月数-总贷款额

BigDecimal m10 = m9.divide(new BigDecimal("10000"),3,BigDecimal.ROUND_HALF_UP);

return m10;
}

/**
* 等额本息 总利息=还款月数×每月月供额-贷款本金
* @param benj 贷款本金
* @param perMonthMoney 每月月供额
* @param montyTotal 还款月数
*/
private BigDecimal computeDEBXTotalRate(BigDecimal benj,BigDecimal perMonthMoney,Integer montyTotal){
BigDecimal m1 = perMonthMoney.multiply(new BigDecimal(montyTotal));
BigDecimal m2 = m1.subtract(benj);
return  m2.divide(new BigDecimal("10000"),3,BigDecimal.ROUND_HALF_UP);
}



/**
* 等额本息 (每月月供额=〔贷款本金×月利率×(1+月利率)^还款月数〕÷〔(1+月利率)^还款月数-1〕)
*/
private BigDecimal perDEBXMonthMoney(BigDecimal monthlyPayment,BigDecimal mStrikeRate,Integer montyTotal) {
BigDecimal strikeRate = mStrikeRate.divide(new BigDecimal(100 * 12), 6, BigDecimal.ROUND_HALF_UP);// 月利率,四舍五入精确到6位小数
BigDecimal benj = monthlyPayment.multiply(new BigDecimal("10000"));// 本金
BigDecimal rate1 = BigDecimal.ONE.add(strikeRate);// (1+月利率)
BigDecimal m1 = benj.multiply(strikeRate);//贷款本金×月利率
BigDecimal m2 = rate1.pow(montyTotal);//(1+月利率)^还款月数
BigDecimal m3 = m1.multiply(m2);//(每月月供额=〔贷款本金×月利率×(1+月利率)^还款月数〕
BigDecimal m4 = m2.subtract(new BigDecimal(1));
BigDecimal m5 = m3.divide(m4,2,BigDecimal.ROUND_HALF_UP);
System.out.println("等额本息,每月月供-->"+m5.toBigInteger());//〔(1+月利率)^还款月数-1〕)
return m5;



}


/**
* 每月月供(等额本金还款法) 每月月供额=(贷款本金÷还款月数)+(贷款本金-已归还本金累计额)×月利率
*/
private BigDecimal perDHBJMonthMoney(BigDecimal monthlyPayment,BigDecimal mStrikeRate,Integer montyTotal) {
BigDecimal strikeRate = mStrikeRate.divide(new BigDecimal(100 * 12), 6, BigDecimal.ROUND_HALF_UP);// 月利率,四舍五入精确到6位小数
BigDecimal benj = monthlyPayment.multiply(new BigDecimal("10000"));// 本金
BigDecimal m1 = benj.divide(new BigDecimal(montyTotal),6,BigDecimal.ROUND_HALF_UP);// (贷款本金÷还款月数)
BigDecimal m2 = benj.subtract(new BigDecimal(0)); // (贷款本金-已归还本金累计额)首月归还0
BigDecimal m3 = m2.multiply(strikeRate);// (贷款本金-已归还本金累计额)×月利率
BigDecimal m4 = m1.add(m3).setScale(2);
System.out.println("等额本金,每月月供-->"+m4.toString());
return m4;
}



public static void main(String[] args) {
RateUtils t = new RateUtils();
BigDecimal mStrikeRate = new BigDecimal("4.75");// 年利率
Integer montyTotal = 5*12;
BigDecimal monthlyPayment = new BigDecimal("15");// 100万贷款
BigDecimal benj = monthlyPayment.multiply(new BigDecimal("10000"));// 本金
BigDecimal t1 =  t.perDEBXMonthMoney(monthlyPayment,mStrikeRate,montyTotal);
BigDecimal t2 = t.perDHBJMonthMoney(monthlyPayment,mStrikeRate,montyTotal);
BigDecimal t3 = t.computeDEBXTotalRate(benj,t1,montyTotal);
BigDecimal t4 = t.computeDEBJTotalRate(monthlyPayment, mStrikeRate, montyTotal);
System.out.println("等额本息-总利息->"+t3.toString());
System.out.println("等额本金-总利息->"+t4.toString());
}


}
0 0
原创粉丝点击