贷款计算器
等额本息
public Map<String,Object> returnMethodOne(Integer loanMethod,
Integer computeMethod,
BigDecimal businessPrice,
BigDecimal loanTotalPrice,
BigDecimal publicReserveFunds,
Integer businessYears,
Integer publicReserveFundsYears,
Integer rateMethod,
BigDecimal LPR,
BigDecimal publicReserveFundsRate,
BigDecimal basePoint,
BigDecimal businessRate,
BigDecimal houseTotalPrice,
BigDecimal loanRate
){
// 利息总额
BigDecimal moneyRatesPrice = null;
// 每月应还款数
BigDecimal everymouthReturnPrice = null;
List<ComputeInfoListVo> list = null;
// 商业贷款
if(1 == loanMethod){
// 月利率 = 商贷利率 / 12
BigDecimal monthRate = businessRate.divide(new BigDecimal(100),10,BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(12),10,BigDecimal.ROUND_HALF_UP);
// 总利率 = (月利率 + 1)^月数
BigDecimal totalRate = (monthRate.add(new BigDecimal(1))).pow(businessYears * 12);
// 商贷每月还款 = 商贷金额 x 月利率 x 总利率 / (总利率 - 1)
everymouthReturnPrice = ((businessPrice.multiply(monthRate)).multiply(totalRate)).divide((totalRate.subtract(new BigDecimal(1))),10,BigDecimal.ROUND_HALF_UP);
// 商贷利息总额 = 商贷每月还款 x 月数 - 商贷金额
moneyRatesPrice = everymouthReturnPrice.multiply(new BigDecimal(businessYears*12)).subtract(businessPrice);
// 每月计算列表
list = principalAndRateComputeList(loanMethod,monthRate,businessPrice,everymouthReturnPrice,businessYears * 12,null);
}else if (2 == loanMethod){ // 组合贷款
// 按贷款总额计算
if(1 == computeMethod) {
if (loanTotalPrice.compareTo(publicReserveFunds) < 0 || loanTotalPrice.compareTo(businessPrice) < 0) {
return null;
}
}
// 公积金月利率 = 公积金利率 / 12
BigDecimal publicRate = publicReserveFundsRate.divide(new BigDecimal(100),10,BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(12),10,BigDecimal.ROUND_HALF_UP);
// 基金总利率 = (公积金月利率 + 1)^月数
BigDecimal publicTotalRate = (publicRate.add(new BigDecimal(1))).pow(publicReserveFundsYears*12);
// 基金每月还款数 = 公积金金额 x 公积金月利率 x 基金总利率 / (基金总利率 - 1)
BigDecimal publicMonthReturn = publicReserveFunds.multiply(publicRate).multiply(publicTotalRate).divide((publicTotalRate.subtract(new BigDecimal(1))),10,BigDecimal.ROUND_HALF_UP);
// 基金利息总额 = 基金每月还款数 x 月数 - 公积金金额
BigDecimal publicRateTotalPrice = publicMonthReturn.multiply(new BigDecimal(publicReserveFundsYears*12)).subtract(publicReserveFunds);
// 月利率 = 商贷利率 / 12
BigDecimal monthRate = businessRate.divide(new BigDecimal(100),10,BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(12),10,BigDecimal.ROUND_HALF_UP);
// 总利率 = (月利率 + 1)^月数
BigDecimal totalRate = (monthRate.add(new BigDecimal(1))).pow(businessYears * 12);
// 商贷每月还款 = 商贷金额 x 月利率 x 总利率 / (总利率 - 1)
BigDecimal businessMouthReturn = ((businessPrice.multiply(monthRate)).multiply(totalRate)).divide((totalRate.subtract(new BigDecimal(1))),10,BigDecimal.ROUND_HALF_UP);
// 商贷利息总额 = 商贷每月还款 x 月数 - 商贷金额
BigDecimal businessRateTotalPrice = businessMouthReturn.multiply(new BigDecimal(businessYears*12)).subtract(businessPrice);
// 按贷款总额计算,每月还款金额 = 公积金还款金额 + 商贷还款金额
everymouthReturnPrice = publicMonthReturn.add(businessMouthReturn);
// 利息总额 = 商贷利息总额 + 基金利息总额
moneyRatesPrice = businessRateTotalPrice.add(publicRateTotalPrice);
int years = 0;
if (businessYears > publicReserveFundsYears){
years = businessYears;
}else {
years = publicReserveFundsYears;
}
// 每月计算列表
list = principalAndRateComputeList(loanMethod,null,loanTotalPrice,everymouthReturnPrice,years*12,businessMouthReturn);
}else if (3 == loanMethod){ // 公积金贷款
// 公积金月利率 = 公积金利率 / 12
BigDecimal publicRate = publicReserveFundsRate.divide(new BigDecimal(100),10,BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(12),10,BigDecimal.ROUND_HALF_UP);
// 基金总利率 = (公积金月利率 + 1)^月数
BigDecimal publicTotalRate = (publicRate.add(new BigDecimal(1))).pow(publicReserveFundsYears*12);
// 基金每月还款数 = 公积金金额 x 公积金月利率 x 基金总利率 / (基金总利率 - 1)
everymouthReturnPrice = publicReserveFunds.multiply(publicRate).multiply(publicTotalRate).divide((publicTotalRate.subtract(new BigDecimal(1))),10,BigDecimal.ROUND_HALF_UP);
// 基金利息总额 = 基金每月还款数 x 月数 - 公积金金额
moneyRatesPrice = everymouthReturnPrice.multiply(new BigDecimal(publicReserveFundsYears*12)).subtract(publicReserveFunds);
// 每月计算列表
list = principalAndRateComputeList(loanMethod,publicRate,publicReserveFunds,everymouthReturnPrice,publicReserveFundsYears*12,null);
}
// 等额本息贷款计算返回结果视图
LoanComputeVo principalAndRateVo = new LoanComputeVo();
principalAndRateVo.setEveryMouthReturn(everymouthReturnPrice.setScale(2,BigDecimal.ROUND_HALF_UP));
if (1 == loanMethod){
principalAndRateVo.setLoanTotal(businessPrice.divide(new BigDecimal(10000),2,BigDecimal.ROUND_HALF_UP));
principalAndRateVo.setLoanYears(businessYears);
}else if (2 == loanMethod){
principalAndRateVo.setLoanTotal(loanTotalPrice.divide(new BigDecimal(10000),2,BigDecimal.ROUND_HALF_UP));
if (businessYears > publicReserveFundsYears){
principalAndRateVo.setLoanYears(businessYears);
}else {
principalAndRateVo.setLoanYears(publicReserveFundsYears);
}
}else if (3 == loanMethod){
principalAndRateVo.setLoanTotal(publicReserveFunds.divide(new BigDecimal(10000),2,BigDecimal.ROUND_HALF_UP));
principalAndRateVo.setLoanYears(publicReserveFundsYears);
}
principalAndRateVo.setRateTotalPrice(moneyRatesPrice.divide(new BigDecimal(10000),2,BigDecimal.ROUND_HALF_UP));
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("principalAndRateVo",principalAndRateVo);
hashMap.put("principalAndRateComputeList",list);
return hashMap;
}
等额本金
public Map<String,Object> returnMethodTwo(Integer loanMethod,
Integer computeMethod,
BigDecimal businessPrice,
BigDecimal loanTotalPrice,
BigDecimal publicReserveFunds,
Integer businessYears,
Integer publicReserveFundsYears,
Integer rateMethod,
BigDecimal LPR,
BigDecimal publicReserveFundsRate,
BigDecimal basePoint,
BigDecimal businessRate,
BigDecimal houseTotalPrice,
BigDecimal loanRate
){
// 首月应还金额
BigDecimal everymouthReturnPrice = null;
// 每月递减利息
BigDecimal decreaseMonth = null;
// 利息总额
BigDecimal moneyRatesPrice = null;
List<ComputeInfoListVo> list = null;
if(1 == loanMethod){
// 月利率
BigDecimal monthRate = businessRate.divide(new BigDecimal(100),10,BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(12),10,BigDecimal.ROUND_HALF_UP);
// 每月还款本金
BigDecimal prePrincipal = businessPrice.divide(new BigDecimal(businessYears*12),10,BigDecimal.ROUND_HALF_UP);
// 首月应还金额
everymouthReturnPrice = prePrincipal.add(businessPrice.multiply(monthRate));
// 每月递减利息
decreaseMonth = prePrincipal.multiply(monthRate);
// 利息总额
moneyRatesPrice = businessPrice.multiply(new BigDecimal(businessYears*12 +1)).multiply(monthRate).divide(new BigDecimal(2),10,BigDecimal.ROUND_HALF_UP);
// 等额本金每月计算列表
list = principalList(loanMethod,businessPrice,monthRate,businessYears*12,null,null,null,null);
}else if (2 == loanMethod){
// 按贷款总额计算
if(1 == computeMethod) {
// 贷款金额 = 贷款总额 - 公积金金额
if (loanTotalPrice.compareTo(publicReserveFunds) < 0 || loanTotalPrice.compareTo(businessPrice) < 0) {
return null;
}
}
// 基金月利率
BigDecimal publicMonthRate = publicReserveFundsRate.divide(new BigDecimal(100),10,BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(12),10,BigDecimal.ROUND_HALF_UP);
// 基金每月还款本金
BigDecimal prePubPrincipal = publicReserveFunds.divide(new BigDecimal(publicReserveFundsYears*12),10,BigDecimal.ROUND_HALF_UP);
// 基金首月应还金额
BigDecimal firstPubMonth = prePubPrincipal.add(publicReserveFunds.multiply(publicMonthRate));
// 基金每月递减利息
BigDecimal pubDecreaseMonth = prePubPrincipal.multiply(publicMonthRate);
// 基金利息总额
BigDecimal pubRateTotal = publicReserveFunds.multiply(new BigDecimal(publicReserveFundsYears*12+1)).multiply(publicMonthRate).divide(new BigDecimal(2),10,BigDecimal.ROUND_HALF_UP);
// 月利率
BigDecimal monthRate = businessRate.divide(new BigDecimal(100),10,BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(12),10,BigDecimal.ROUND_HALF_UP);
// 每月还款本金
BigDecimal prePrincipal = businessPrice.divide(new BigDecimal(businessYears*12),10,BigDecimal.ROUND_HALF_UP);
// 商贷首月应还金额
BigDecimal busFirstMonth = prePrincipal.add(businessPrice.multiply(monthRate));
// 商贷每月递减利息
BigDecimal busDecreaseMouth = prePrincipal.multiply(monthRate);
// 商贷利息总额
BigDecimal busRateTotalPrice = businessPrice.multiply(new BigDecimal(businessYears*12 +1)).multiply(monthRate).divide(new BigDecimal(2),10,BigDecimal.ROUND_HALF_UP);
// 首月应还金额 = 商贷首月应还金额 + 基金首月应还金额
everymouthReturnPrice = busFirstMonth.add(firstPubMonth);
// 每月递减利息 = 商贷每月递减利息 + 基金每月递减利息
decreaseMonth = busDecreaseMouth.add(pubDecreaseMonth);
// 利息总额 = 商贷利息总额 + 基金利息总额
moneyRatesPrice = busRateTotalPrice.add(pubRateTotal);
int years = 0;
if(businessYears > publicReserveFundsYears){
years = businessYears;
}else {
years = publicReserveFundsYears;
}
// 等额本金每月计算列表
list = principalList(loanMethod,loanTotalPrice,null,years*12,firstPubMonth,pubDecreaseMonth,busFirstMonth,busDecreaseMouth);
}else if (3 == loanMethod){
// 基金月利率
BigDecimal publicMonthRate = publicReserveFundsRate.divide(new BigDecimal(100),10,BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(12),10,BigDecimal.ROUND_HALF_UP);
// 基金每月还款本金
BigDecimal prePubPrincipal = publicReserveFunds.divide(new BigDecimal(publicReserveFundsYears*12),10,BigDecimal.ROUND_HALF_UP);
// 基金首月应还金额
everymouthReturnPrice = prePubPrincipal.add(publicReserveFunds.multiply(publicMonthRate));
// 基金每月递减利息
decreaseMonth = prePubPrincipal.multiply(publicMonthRate);
// 基金利息总额
moneyRatesPrice = publicReserveFunds.multiply(new BigDecimal(publicReserveFundsYears*12+1)).multiply(publicMonthRate).divide(new BigDecimal(2),10,BigDecimal.ROUND_HALF_UP);
// 等额本金每月计算列表
list = principalList(loanMethod,publicReserveFunds,publicMonthRate,publicReserveFundsYears*12,null,null,null,null);
}
// 等额本息贷款计算返回结果视图
LoanComputeVo principalVo = new LoanComputeVo();
principalVo.setEveryMouthReturn(everymouthReturnPrice.setScale(2,BigDecimal.ROUND_HALF_UP));
if (1 == loanMethod){
principalVo.setLoanTotal(businessPrice.divide(new BigDecimal(10000),2,BigDecimal.ROUND_HALF_UP));
principalVo.setLoanYears(businessYears);
}else if (2 == loanMethod){
principalVo.setLoanTotal(loanTotalPrice.divide(new BigDecimal(10000),2,BigDecimal.ROUND_HALF_UP));
if (businessYears > publicReserveFundsYears){
principalVo.setLoanYears(businessYears);
}else {
principalVo.setLoanYears(publicReserveFundsYears);
}
}else if (3 == loanMethod){
principalVo.setLoanTotal(publicReserveFunds.divide(new BigDecimal(10000),2,BigDecimal.ROUND_HALF_UP));
principalVo.setLoanYears(publicReserveFundsYears);
}
principalVo.setRateTotalPrice(moneyRatesPrice.divide(new BigDecimal(10000),2,BigDecimal.ROUND_HALF_UP));
principalVo.setDecreaseMouth(decreaseMonth.setScale(2,BigDecimal.ROUND_HALF_UP));
Map<String,Object> hashMap = new HashMap<>();
hashMap.put("principalVo",principalVo);
hashMap.put("principalList",list);
return hashMap;
}
项目中有贷款计算器功能,第一次写贷款计算器,哪里又不好之处望大家谅解,谢谢!