package com.geekq.common.utils.numcal; import java.math.BigDecimal; import java.math.RoundingMode; /** * 计算器Util * @author 邱润泽 */ public class CalculateUtil { public static final BigDecimal ONE_HUNDRED = new BigDecimal("100.0000"); public static final BigDecimal NUMBER_MONTHS_OF_YEAR = new BigDecimal( "12.0000"); /** * 获取月利率 */ public static BigDecimal getMonthlyRate(BigDecimal yearRate) { if (yearRate == null) return BigDecimal.ZERO; return yearRate.divide(ONE_HUNDRED).divide(NUMBER_MONTHS_OF_YEAR, BidConst.CAL_SCALE, RoundingMode.HALF_UP); } /** * 计算借款总利息 * * @param returnType 还款类型 * @param bidRequestAmount 借款金额 * @param yearRate 年利率 * @param monthes2Return 还款期限 * @return */ public static BigDecimal calTotalInterest(int returnType, BigDecimal bidRequestAmount, BigDecimal yearRate, int monthes2Return) { BigDecimal totalInterest = BigDecimal.ZERO; BigDecimal monthlyRate = getMonthlyRate(yearRate); if (returnType == BidConst.RETURN_TYPE_MONTH_INTEREST_PRINCIPAL) {// 按月分期 // 只借款一个月 if (monthes2Return == 1) { totalInterest = bidRequestAmount.multiply(monthlyRate) .setScale(BidConst.CAL_SCALE, RoundingMode.HALF_UP); } else { BigDecimal temp1 = bidRequestAmount.multiply(monthlyRate); BigDecimal temp2 = (BigDecimal.ONE.add(monthlyRate)) .pow(monthes2Return); BigDecimal temp3 = (BigDecimal.ONE.add(monthlyRate)).pow( monthes2Return).subtract(BigDecimal.ONE); // 算出每月还款 BigDecimal monthToReturnMoney = temp1.multiply(temp2).divide( temp3, BidConst.CAL_SCALE, RoundingMode.HALF_UP); // 算出总还款 BigDecimal totalReturnMoney = monthToReturnMoney .multiply(new BigDecimal(monthes2Return)); // 算出总利息 totalInterest = totalReturnMoney.subtract(bidRequestAmount); } } else if (returnType == BidConst.RETURN_TYPE_MONTH_INTEREST) {// 按月到期 BigDecimal monthlyInterest = DecimalFormatUtil .amountFormat(bidRequestAmount.multiply(monthlyRate)); totalInterest = monthlyInterest.multiply(new BigDecimal( monthes2Return)); } return DecimalFormatUtil.formatBigDecimal(totalInterest, BidConst.STORE_SCALE); } /** * 计算每期利息 * * @param returnType 还款类型 * @param bidRequestAmount 借款金额 * @param yearRate 年利率 * @param monthIndex 第几期 * @param monthes2Return 还款期限 * @return */ public static BigDecimal calMonthlyInterest(int returnType, BigDecimal bidRequestAmount, BigDecimal yearRate, int monthIndex, int monthes2Return) { BigDecimal monthlyInterest = BigDecimal.ZERO; BigDecimal monthlyRate = getMonthlyRate(yearRate); if (returnType == BidConst.RETURN_TYPE_MONTH_INTEREST_PRINCIPAL) {// 按月分期 // 只借款一个月 if (monthes2Return == 1) { monthlyInterest = bidRequestAmount.multiply(monthlyRate) .setScale(BidConst.CAL_SCALE, RoundingMode.HALF_UP); } else { BigDecimal temp1 = bidRequestAmount.multiply(monthlyRate); BigDecimal temp2 = (BigDecimal.ONE.add(monthlyRate)) .pow(monthes2Return); BigDecimal temp3 = (BigDecimal.ONE.add(monthlyRate)).pow( monthes2Return).subtract(BigDecimal.ONE); BigDecimal temp4 = (BigDecimal.ONE.add(monthlyRate)) .pow(monthIndex - 1); // 算出每月还款 BigDecimal monthToReturnMoney = temp1.multiply(temp2).divide( temp3, BidConst.CAL_SCALE, RoundingMode.HALF_UP); // 算出总还款 BigDecimal totalReturnMoney = monthToReturnMoney .multiply(new BigDecimal(monthes2Return)); // 算出总利息 BigDecimal totalInterest = totalReturnMoney .subtract(bidRequestAmount); if (monthIndex < monthes2Return) { monthlyInterest = (temp1.subtract(monthToReturnMoney)) .multiply(temp4).add(monthToReturnMoney) .setScale(BidConst.CAL_SCALE, RoundingMode.HALF_UP); } else if (monthIndex == monthes2Return) { BigDecimal temp6 = BigDecimal.ZERO; // 汇总最后一期之前所有利息之和 for (int i = 1; i < monthes2Return; i++) { BigDecimal temp5 = (BigDecimal.ONE.add(monthlyRate)) .pow(i - 1); monthlyInterest = (temp1.subtract(monthToReturnMoney)) .multiply(temp5) .add(monthToReturnMoney) .setScale(BidConst.CAL_SCALE, RoundingMode.HALF_UP); temp6 = temp6.add(monthlyInterest); } monthlyInterest = totalInterest.subtract(temp6); } } } else if (returnType == BidConst.RETURN_TYPE_MONTH_INTEREST) {// 按月到期 monthlyInterest = DecimalFormatUtil.amountFormat(bidRequestAmount .multiply(monthlyRate)); } return monthlyInterest; } /** * 计算每期还款 * * @param returnType 还款类型 * @param bidRequestAmount 借款金额 * @param yearRate 年利率 * @param monthIndex 第几期 * @param monthes2Return 还款期限 * @return */ public static BigDecimal calMonthToReturnMoney(int returnType, BigDecimal bidRequestAmount, BigDecimal yearRate, int monthIndex, int monthes2Return) { BigDecimal monthToReturnMoney = BigDecimal.ZERO; BigDecimal monthlyRate = getMonthlyRate(yearRate); if (returnType == BidConst.RETURN_TYPE_MONTH_INTEREST_PRINCIPAL) {// 按月分期 if (monthes2Return == 1) { monthToReturnMoney = bidRequestAmount.add( bidRequestAmount.multiply(monthlyRate)).setScale( BidConst.CAL_SCALE, RoundingMode.HALF_UP); } else { BigDecimal temp1 = bidRequestAmount.multiply(monthlyRate); BigDecimal temp2 = (BigDecimal.ONE.add(monthlyRate)) .pow(monthes2Return); BigDecimal temp3 = (BigDecimal.ONE.add(monthlyRate)).pow( monthes2Return).subtract(BigDecimal.ONE); // 算出每月还款 monthToReturnMoney = temp1.multiply(temp2).divide(temp3, BidConst.CAL_SCALE, RoundingMode.HALF_UP); } } else if (returnType == BidConst.RETURN_TYPE_MONTH_INTEREST) {// 按月到期 BigDecimal monthlyInterest = bidRequestAmount.multiply(monthlyRate) .setScale(BidConst.CAL_SCALE, RoundingMode.HALF_UP); if (monthIndex == monthes2Return) { monthToReturnMoney = bidRequestAmount.add(monthlyInterest) .setScale(BidConst.CAL_SCALE, RoundingMode.HALF_UP); } else if (monthIndex < monthes2Return) { monthToReturnMoney = monthlyInterest; } } return DecimalFormatUtil.formatBigDecimal(monthToReturnMoney, BidConst.STORE_SCALE); } /** * 计算一次投标实际获得的利息=投标金额/借款金额 *总利息 * * @param bidRequestAmount 借款金额 * @param monthes2Return 还款期数 * @param yearRate 年利率 * @param returnType 还款类型 * @param acturalBidAmount 投标金额 * @return */ public static BigDecimal calBidInterest(BigDecimal bidRequestAmount, int monthes2Return, BigDecimal yearRate, int returnType, BigDecimal acturalBidAmount) { // 借款产生的总利息 BigDecimal totalInterest = calTotalInterest(returnType, bidRequestAmount, yearRate, monthes2Return); // 所占比例 BigDecimal proportion = acturalBidAmount.divide(bidRequestAmount, BidConst.CAL_SCALE, RoundingMode.HALF_UP); BigDecimal bidInterest = totalInterest.multiply(proportion); return DecimalFormatUtil.formatBigDecimal(bidInterest, BidConst.STORE_SCALE); } /** * 计算利息管理费 * * @param interest * 利息 * @param interestManagerChargeRate * 利息管理费比例 * @return */ /** public static BigDecimal calInterestManagerCharge(BigDecimal interest) { return DecimalFormatUtil.formatBigDecimal( interest.multiply(BidConst.INTEREST_MANAGER_CHARGE_RATE), BidConst.SCALE); } */ /** * 计算借款管理费 * * @param bidRequestAmount 借款金额 * @return */ public static BigDecimal calAccountManagementCharge( BigDecimal bidRequestAmount) { BigDecimal accountManagementCharge = DecimalFormatUtil .formatBigDecimal(bidRequestAmount .multiply(BidConst.ACCOUNT_MANAGER_CHARGE_RATE), BidConst.CAL_SCALE); return accountManagementCharge; } }