From 49d1704b6504a93cd8fe2f39095871345e92fa92 Mon Sep 17 00:00:00 2001 From: muzi1 <2098333240@qq.com> Date: Mon, 16 Jan 2023 12:09:58 +0800 Subject: [PATCH] CRUD --- .../controller/BorrowerController.java | 8 + .../impl/TbBorrowerPeriodsServiceImpl.java | 14 +- .../service/impl/TbBorrowerServiceImpl.java | 8 +- .../AverageCapitalPlusInterestUtils.java | 202 +++++++++++-- .../potenza/utils/AverageCapitalUtils.java | 276 +++++++++++++----- 5 files changed, 394 insertions(+), 114 deletions(-) diff --git a/ruoyi-modules/ruoyi-potenza/src/main/java/com/ruoyi/potenza/controller/BorrowerController.java b/ruoyi-modules/ruoyi-potenza/src/main/java/com/ruoyi/potenza/controller/BorrowerController.java index a65f6ff4..850cbb62 100644 --- a/ruoyi-modules/ruoyi-potenza/src/main/java/com/ruoyi/potenza/controller/BorrowerController.java +++ b/ruoyi-modules/ruoyi-potenza/src/main/java/com/ruoyi/potenza/controller/BorrowerController.java @@ -7,6 +7,8 @@ import com.ruoyi.common.security.annotation.RequiresPermissions; import com.ruoyi.potenza.domain.TbBorrower; import com.ruoyi.potenza.domain.vo.IdVo; import com.ruoyi.potenza.service.TbBorrowerService; +import com.ruoyi.potenza.utils.AverageCapitalPlusInterestUtils; +import com.ruoyi.potenza.utils.AverageCapitalUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import java.util.List; @@ -124,6 +126,12 @@ public class BorrowerController extends BaseController { return tbBorrowerService.loans(tbBorrower); } + @PostMapping("ttt") + public void ttt(){ + AverageCapitalUtils.main(); + AverageCapitalPlusInterestUtils.main(); + } + diff --git a/ruoyi-modules/ruoyi-potenza/src/main/java/com/ruoyi/potenza/service/impl/TbBorrowerPeriodsServiceImpl.java b/ruoyi-modules/ruoyi-potenza/src/main/java/com/ruoyi/potenza/service/impl/TbBorrowerPeriodsServiceImpl.java index 0757d77f..25951d9d 100644 --- a/ruoyi-modules/ruoyi-potenza/src/main/java/com/ruoyi/potenza/service/impl/TbBorrowerPeriodsServiceImpl.java +++ b/ruoyi-modules/ruoyi-potenza/src/main/java/com/ruoyi/potenza/service/impl/TbBorrowerPeriodsServiceImpl.java @@ -12,7 +12,9 @@ import com.ruoyi.potenza.utils.AverageCapitalUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.List; +import java.util.Map; /** * @author 86155 @@ -121,11 +123,13 @@ public class TbBorrowerPeriodsServiceImpl extends ServiceImpl +// * 公式:每月偿还本息=〔贷款本金×月利率×(1+月利率)^还款月数〕÷〔(1+月利率)^还款月数-1〕 +// * +// * @param invest 总借款额(贷款本金) +// * @param yearRate 年利率 +// * @param month 还款总月数 +// * @return 每月偿还本金和利息, 不四舍五入,直接截取小数点最后两位 +// */ +// public static double getPerMonthPrincipalInterest(double invest, double yearRate, int totalmonth) { +// double monthRate = yearRate / 12; +// BigDecimal monthIncome = new BigDecimal(invest) +// .multiply(new BigDecimal(monthRate * Math.pow(1 + monthRate, totalmonth))) +// .divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 2, BigDecimal.ROUND_DOWN); +// return monthIncome.doubleValue(); +// } +// +// /** +// * 等额本息计算获取还款方式为等额本息的每月偿还利息 +// *

+// * 公式:每月偿还利息=贷款本金×月利率×〔(1+月利率)^还款月数-(1+月利率)^(还款月序号-1)〕÷〔(1+月利率)^还款月数-1〕 +// * +// * @param invest 总借款额(贷款本金) +// * @param yearRate 年利率 +// * @param month 还款总月数 +// * @return 每月偿还利息 +// */ +// public static Map getPerMonthInterest(double invest, double yearRate, int totalmonth) { +// Map map = new HashMap(); +// double monthRate = yearRate / 12; +// BigDecimal monthInterest; +// for (int i = 1; i < totalmonth + 1; i++) { +// BigDecimal multiply = new BigDecimal(invest).multiply(new BigDecimal(monthRate)); +// BigDecimal sub = new BigDecimal(Math.pow(1 + monthRate, totalmonth)).subtract(new BigDecimal(Math.pow(1 + monthRate, i - 1))); +// monthInterest = multiply.multiply(sub).divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 6, BigDecimal.ROUND_DOWN); +// monthInterest = monthInterest.setScale(2, BigDecimal.ROUND_DOWN); +// map.put(i, monthInterest); +// } +// return map; +// } +// +// /** +// * 等额本息计算获取还款方式为等额本息的每月偿还本金 +// * +// * @param invest 总借款额(贷款本金) +// * @param yearRate 年利率 +// * @param month 还款总月数 +// * @return 每月偿还本金 +// */ +// public static Map getPerMonthPrincipal(double invest, double yearRate, int totalmonth) { +// double monthRate = yearRate / 12; +// BigDecimal monthIncome = new BigDecimal(invest) +// .multiply(new BigDecimal(monthRate * Math.pow(1 + monthRate, totalmonth))) +// .divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 2, BigDecimal.ROUND_DOWN); +// Map mapInterest = getPerMonthInterest(invest, yearRate, totalmonth); +// Map mapPrincipal = new HashMap(); +// +// for (Map.Entry entry : mapInterest.entrySet()) { +// mapPrincipal.put(entry.getKey(), monthIncome.subtract(entry.getValue())); +// } +// return mapPrincipal; +// } +// +// /** +// * 等额本息计算获取还款方式为等额本息的总利息 +// * +// * @param invest 总借款额(贷款本金) +// * @param yearRate 年利率 +// * @param month 还款总月数 +// * @return 总利息 +// */ +// public static double getInterestCount(double invest, double yearRate, int totalmonth) { +// BigDecimal count = new BigDecimal(0); +// Map mapInterest = getPerMonthInterest(invest, yearRate, totalmonth); +// +// for (Map.Entry entry : mapInterest.entrySet()) { +// count = count.add(entry.getValue()); +// } +// return count.doubleValue(); +// } +// +// /** +// * 应还本金总和 +// * +// * @param invest 总借款额(贷款本金) +// * @param yearRate 年利率 +// * @param month 还款总月数 +// * @return 应还本金总和 +// */ +// public static double getPrincipalInterestCount(double invest, double yearRate, int totalmonth) { +// double monthRate = yearRate / 12; +// BigDecimal perMonthInterest = new BigDecimal(invest) +// .multiply(new BigDecimal(monthRate * Math.pow(1 + monthRate, totalmonth))) +// .divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 2, BigDecimal.ROUND_DOWN); +// BigDecimal count = perMonthInterest.multiply(new BigDecimal(totalmonth)); +// count = count.setScale(2, BigDecimal.ROUND_DOWN); +// return count.doubleValue(); +// } +// +// +// /** +// * @param args +// */ +// public static void main(String[] args) { +// double invest = 20000; // 本金 +// int month = 12; +// double yearRate = 0.15; // 年利率 +// double perMonthPrincipalInterest = getPerMonthPrincipalInterest(invest, yearRate, month); +// System.out.println("等额本息---每月还款本息:" + perMonthPrincipalInterest); +// Map mapInterest = getPerMonthInterest(invest, yearRate, month); +// System.out.println("等额本息---每月还款利息:" + mapInterest); +// Map mapPrincipal = getPerMonthPrincipal(invest, yearRate, month); +// System.out.println("等额本息---每月还款本金:" + mapPrincipal); +// double count = getInterestCount(invest, yearRate, month); +// System.out.println("等额本息---总利息:" + count); +// double principalInterestCount = getPrincipalInterestCount(invest, yearRate, month); +// System.out.println("等额本息---应还本息总和:" + principalInterestCount); +// +// } + /** * 等额本息计算获取还款方式为等额本息的每月偿还本金和利息 - *

+ * * 公式:每月偿还本息=〔贷款本金×月利率×(1+月利率)^还款月数〕÷〔(1+月利率)^还款月数-1〕 * - * @param invest 总借款额(贷款本金) - * @param yearRate 年利率 - * @param month 还款总月数 - * @return 每月偿还本金和利息, 不四舍五入,直接截取小数点最后两位 + * @param invest + * 总借款额(贷款本金) + * @param yearRate + * 年利率 + * @param month + * 还款总月数 + * @return 每月偿还本金和利息,不四舍五入,直接截取小数点最后两位 */ - public static double getPerMonthPrincipalInterest(double invest, double yearRate, int totalmonth) { + public static BigDecimal getPerMonthPrincipalInterest(double invest, double yearRate, int totalmonth) { double monthRate = yearRate / 12; BigDecimal monthIncome = new BigDecimal(invest) .multiply(new BigDecimal(monthRate * Math.pow(1 + monthRate, totalmonth))) - .divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 2, BigDecimal.ROUND_DOWN); - return monthIncome.doubleValue(); + .divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 2, BigDecimal.ROUND_UP); + //return monthIncome.doubleValue(); + return monthIncome; } /** * 等额本息计算获取还款方式为等额本息的每月偿还利息 - *

+ * * 公式:每月偿还利息=贷款本金×月利率×〔(1+月利率)^还款月数-(1+月利率)^(还款月序号-1)〕÷〔(1+月利率)^还款月数-1〕 * - * @param invest 总借款额(贷款本金) - * @param yearRate 年利率 - * @param month 还款总月数 + * @param invest + * 总借款额(贷款本金) + * @param yearRate + * 年利率 + * @param month + * 还款总月数 * @return 每月偿还利息 */ public static Map getPerMonthInterest(double invest, double yearRate, int totalmonth) { @@ -51,8 +179,10 @@ public class AverageCapitalPlusInterestUtils { BigDecimal monthInterest; for (int i = 1; i < totalmonth + 1; i++) { BigDecimal multiply = new BigDecimal(invest).multiply(new BigDecimal(monthRate)); - BigDecimal sub = new BigDecimal(Math.pow(1 + monthRate, totalmonth)).subtract(new BigDecimal(Math.pow(1 + monthRate, i - 1))); - monthInterest = multiply.multiply(sub).divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 6, BigDecimal.ROUND_DOWN); + BigDecimal sub = new BigDecimal(Math.pow(1 + monthRate, totalmonth)) + .subtract(new BigDecimal(Math.pow(1 + monthRate, i - 1))); + monthInterest = multiply.multiply(sub).divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 2, + BigDecimal.ROUND_DOWN); monthInterest = monthInterest.setScale(2, BigDecimal.ROUND_DOWN); map.put(i, monthInterest); } @@ -62,9 +192,12 @@ public class AverageCapitalPlusInterestUtils { /** * 等额本息计算获取还款方式为等额本息的每月偿还本金 * - * @param invest 总借款额(贷款本金) - * @param yearRate 年利率 - * @param month 还款总月数 + * @param invest + * 总借款额(贷款本金) + * @param yearRate + * 年利率 + * @param month + * 还款总月数 * @return 每月偿还本金 */ public static Map getPerMonthPrincipal(double invest, double yearRate, int totalmonth) { @@ -84,9 +217,12 @@ public class AverageCapitalPlusInterestUtils { /** * 等额本息计算获取还款方式为等额本息的总利息 * - * @param invest 总借款额(贷款本金) - * @param yearRate 年利率 - * @param month 还款总月数 + * @param invest + * 总借款额(贷款本金) + * @param yearRate + * 年利率 + * @param month + * 还款总月数 * @return 总利息 */ public static double getInterestCount(double invest, double yearRate, int totalmonth) { @@ -102,9 +238,12 @@ public class AverageCapitalPlusInterestUtils { /** * 应还本金总和 * - * @param invest 总借款额(贷款本金) - * @param yearRate 年利率 - * @param month 还款总月数 + * @param invest + * 总借款额(贷款本金) + * @param yearRate + * 年利率 + * @param month + * 还款总月数 * @return 应还本金总和 */ public static double getPrincipalInterestCount(double invest, double yearRate, int totalmonth) { @@ -117,16 +256,21 @@ public class AverageCapitalPlusInterestUtils { return count.doubleValue(); } - /** * @param args */ - public static void main(String[] args) { - double invest = 20000; // 本金 + public static void main() { + double invest = 10000; // 本金 int month = 12; - double yearRate = 0.15; // 年利率 - double perMonthPrincipalInterest = getPerMonthPrincipalInterest(invest, yearRate, month); + double yearRate = 0.015; // 年利率 + BigDecimal perMonthPrincipalInterest = getPerMonthPrincipalInterest(invest, yearRate, month); System.out.println("等额本息---每月还款本息:" + perMonthPrincipalInterest); + System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 3)); + System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 6)); + System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 9)); + System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 12)); + System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 15)); + System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 18)); Map mapInterest = getPerMonthInterest(invest, yearRate, month); System.out.println("等额本息---每月还款利息:" + mapInterest); Map mapPrincipal = getPerMonthPrincipal(invest, yearRate, month); @@ -135,7 +279,7 @@ public class AverageCapitalPlusInterestUtils { System.out.println("等额本息---总利息:" + count); double principalInterestCount = getPrincipalInterestCount(invest, yearRate, month); System.out.println("等额本息---应还本息总和:" + principalInterestCount); - } + } diff --git a/ruoyi-modules/ruoyi-potenza/src/main/java/com/ruoyi/potenza/utils/AverageCapitalUtils.java b/ruoyi-modules/ruoyi-potenza/src/main/java/com/ruoyi/potenza/utils/AverageCapitalUtils.java index 35b3568b..b445fd78 100644 --- a/ruoyi-modules/ruoyi-potenza/src/main/java/com/ruoyi/potenza/utils/AverageCapitalUtils.java +++ b/ruoyi-modules/ruoyi-potenza/src/main/java/com/ruoyi/potenza/utils/AverageCapitalUtils.java @@ -10,10 +10,154 @@ import java.util.Map; * @date 2023/1/15 20:49 */ public class AverageCapitalUtils { +// /** +// * 等额本息计算获取还款方式为等额本息的每月偿还本金和利息 +// * +// * 公式:每月偿还本息=〔贷款本金×月利率×(1+月利率)^还款月数〕÷〔(1+月利率)^还款月数-1〕 +// * +// * @param invest +// * 总借款额(贷款本金) +// * @param yearRate +// * 年利率 +// * @param month +// * 还款总月数 +// * @return 每月偿还本金和利息,不四舍五入,直接截取小数点最后两位 +// */ +// public static BigDecimal getPerMonthPrincipalInterest(double invest, double yearRate, int totalmonth) { +// double monthRate = yearRate / 12; +// BigDecimal monthIncome = new BigDecimal(invest) +// .multiply(new BigDecimal(monthRate * Math.pow(1 + monthRate, totalmonth))) +// .divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 2, BigDecimal.ROUND_UP); +// //return monthIncome.doubleValue(); +// return monthIncome; +// } +// +// /** +// * 等额本息计算获取还款方式为等额本息的每月偿还利息 +// * +// * 公式:每月偿还利息=贷款本金×月利率×〔(1+月利率)^还款月数-(1+月利率)^(还款月序号-1)〕÷〔(1+月利率)^还款月数-1〕 +// * +// * @param invest +// * 总借款额(贷款本金) +// * @param yearRate +// * 年利率 +// * @param month +// * 还款总月数 +// * @return 每月偿还利息 +// */ +// public static Map getPerMonthInterest(double invest, double yearRate, int totalmonth) { +// Map map = new HashMap(); +// double monthRate = yearRate / 12; +// BigDecimal monthInterest; +// for (int i = 1; i < totalmonth + 1; i++) { +// BigDecimal multiply = new BigDecimal(invest).multiply(new BigDecimal(monthRate)); +// BigDecimal sub = new BigDecimal(Math.pow(1 + monthRate, totalmonth)) +// .subtract(new BigDecimal(Math.pow(1 + monthRate, i - 1))); +// monthInterest = multiply.multiply(sub).divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 2, +// BigDecimal.ROUND_DOWN); +// monthInterest = monthInterest.setScale(2, BigDecimal.ROUND_DOWN); +// map.put(i, monthInterest); +// } +// return map; +// } +// +// /** +// * 等额本息计算获取还款方式为等额本息的每月偿还本金 +// * +// * @param invest +// * 总借款额(贷款本金) +// * @param yearRate +// * 年利率 +// * @param month +// * 还款总月数 +// * @return 每月偿还本金 +// */ +// public static Map getPerMonthPrincipal(double invest, double yearRate, int totalmonth) { +// double monthRate = yearRate / 12; +// BigDecimal monthIncome = new BigDecimal(invest) +// .multiply(new BigDecimal(monthRate * Math.pow(1 + monthRate, totalmonth))) +// .divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 2, BigDecimal.ROUND_DOWN); +// Map mapInterest = getPerMonthInterest(invest, yearRate, totalmonth); +// Map mapPrincipal = new HashMap(); +// +// for (Map.Entry entry : mapInterest.entrySet()) { +// mapPrincipal.put(entry.getKey(), monthIncome.subtract(entry.getValue())); +// } +// return mapPrincipal; +// } +// +// /** +// * 等额本息计算获取还款方式为等额本息的总利息 +// * +// * @param invest +// * 总借款额(贷款本金) +// * @param yearRate +// * 年利率 +// * @param month +// * 还款总月数 +// * @return 总利息 +// */ +// public static double getInterestCount(double invest, double yearRate, int totalmonth) { +// BigDecimal count = new BigDecimal(0); +// Map mapInterest = getPerMonthInterest(invest, yearRate, totalmonth); +// +// for (Map.Entry entry : mapInterest.entrySet()) { +// count = count.add(entry.getValue()); +// } +// return count.doubleValue(); +// } +// +// /** +// * 应还本金总和 +// * +// * @param invest +// * 总借款额(贷款本金) +// * @param yearRate +// * 年利率 +// * @param month +// * 还款总月数 +// * @return 应还本金总和 +// */ +// public static double getPrincipalInterestCount(double invest, double yearRate, int totalmonth) { +// double monthRate = yearRate / 12; +// BigDecimal perMonthInterest = new BigDecimal(invest) +// .multiply(new BigDecimal(monthRate * Math.pow(1 + monthRate, totalmonth))) +// .divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 2, BigDecimal.ROUND_DOWN); +// BigDecimal count = perMonthInterest.multiply(new BigDecimal(totalmonth)); +// count = count.setScale(2, BigDecimal.ROUND_DOWN); +// return count.doubleValue(); +// } +// +// /** +// * @param args +// */ +// public static void main(String[] args) { +// double invest = 38988; // 本金 +// int month = 12; +// double yearRate = 0.15; // 年利率 +// BigDecimal perMonthPrincipalInterest = getPerMonthPrincipalInterest(invest, yearRate, month); +// System.out.println("等额本息---每月还款本息:" + perMonthPrincipalInterest); +// System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 3)); +// System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 6)); +// System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 9)); +// System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 12)); +// System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 15)); +// System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 18)); +// /*Map mapInterest = getPerMonthInterest(invest, yearRate, month); +// System.out.println("等额本息---每月还款利息:" + mapInterest); +// Map mapPrincipal = getPerMonthPrincipal(invest, yearRate, month); +// System.out.println("等额本息---每月还款本金:" + mapPrincipal); +// double count = getInterestCount(invest, yearRate, month); +// System.out.println("等额本息---总利息:" + count); +// double principalInterestCount = getPrincipalInterestCount(invest, yearRate, month); +// System.out.println("等额本息---应还本息总和:" + principalInterestCount);*/ +// } + + /** - * 等额本息计算获取还款方式为等额本息的每月偿还本金和利息 + * 等额本金计算获取还款方式为等额本金的每月偿还本金和利息 * - * 公式:每月偿还本息=〔贷款本金×月利率×(1+月利率)^还款月数〕÷〔(1+月利率)^还款月数-1〕 + * 公式:每月偿还本金=(贷款本金÷还款月数)+(贷款本金-已归还本金累计额)×月利率 * * @param invest * 总借款额(贷款本金) @@ -23,19 +167,25 @@ public class AverageCapitalUtils { * 还款总月数 * @return 每月偿还本金和利息,不四舍五入,直接截取小数点最后两位 */ - public static BigDecimal getPerMonthPrincipalInterest(double invest, double yearRate, int totalmonth) { + public static Map getPerMonthPrincipalInterest(double invest, double yearRate, int totalMonth) { + Map map = new HashMap(); + // 每月本金 + double monthPri = getPerMonthPrincipal(invest, totalMonth); + // 获取月利率 double monthRate = yearRate / 12; - BigDecimal monthIncome = new BigDecimal(invest) - .multiply(new BigDecimal(monthRate * Math.pow(1 + monthRate, totalmonth))) - .divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 2, BigDecimal.ROUND_UP); - //return monthIncome.doubleValue(); - return monthIncome; + monthRate = new BigDecimal(monthRate).setScale(6, BigDecimal.ROUND_DOWN).doubleValue(); + for (int i = 1; i <= totalMonth; i++) { + double monthRes = monthPri + (invest - monthPri * (i - 1)) * monthRate; + monthRes = new BigDecimal(monthRes).setScale(2, BigDecimal.ROUND_DOWN).doubleValue(); + map.put(i, monthRes); + } + return map; } /** - * 等额本息计算获取还款方式为等额本息的每月偿还利息 + * 等额本金计算获取还款方式为等额本金的每月偿还利息 * - * 公式:每月偿还利息=贷款本金×月利率×〔(1+月利率)^还款月数-(1+月利率)^(还款月序号-1)〕÷〔(1+月利率)^还款月数-1〕 + * 公式:每月应还利息=剩余本金×月利率=(贷款本金-已归还本金累计额)×月利率 * * @param invest * 总借款额(贷款本金) @@ -45,24 +195,24 @@ public class AverageCapitalUtils { * 还款总月数 * @return 每月偿还利息 */ - public static Map getPerMonthInterest(double invest, double yearRate, int totalmonth) { - Map map = new HashMap(); - double monthRate = yearRate / 12; - BigDecimal monthInterest; - for (int i = 1; i < totalmonth + 1; i++) { - BigDecimal multiply = new BigDecimal(invest).multiply(new BigDecimal(monthRate)); - BigDecimal sub = new BigDecimal(Math.pow(1 + monthRate, totalmonth)) - .subtract(new BigDecimal(Math.pow(1 + monthRate, i - 1))); - monthInterest = multiply.multiply(sub).divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 2, - BigDecimal.ROUND_DOWN); - monthInterest = monthInterest.setScale(2, BigDecimal.ROUND_DOWN); - map.put(i, monthInterest); + public static Map getPerMonthInterest(double invest, double yearRate, int totalMonth) { + Map inMap = new HashMap(); + double principal = getPerMonthPrincipal(invest, totalMonth); + Map map = getPerMonthPrincipalInterest(invest, yearRate, totalMonth); + for (Map.Entry entry : map.entrySet()) { + BigDecimal principalBigDecimal = new BigDecimal(principal); + BigDecimal principalInterestBigDecimal = new BigDecimal(entry.getValue()); + BigDecimal interestBigDecimal = principalInterestBigDecimal.subtract(principalBigDecimal); + interestBigDecimal = interestBigDecimal.setScale(2, BigDecimal.ROUND_DOWN); + inMap.put(entry.getKey(), interestBigDecimal.doubleValue()); } - return map; + return inMap; } /** - * 等额本息计算获取还款方式为等额本息的每月偿还本金 + * 等额本金计算获取还款方式为等额本金的每月偿还本金 + * + * 公式:每月应还本金=贷款本金÷还款月数 * * @param invest * 总借款额(贷款本金) @@ -72,22 +222,13 @@ public class AverageCapitalUtils { * 还款总月数 * @return 每月偿还本金 */ - public static Map getPerMonthPrincipal(double invest, double yearRate, int totalmonth) { - double monthRate = yearRate / 12; - BigDecimal monthIncome = new BigDecimal(invest) - .multiply(new BigDecimal(monthRate * Math.pow(1 + monthRate, totalmonth))) - .divide(new BigDecimal(Math.pow(1 + monthRate, totalmonth) - 1), 2, BigDecimal.ROUND_DOWN); - Map mapInterest = getPerMonthInterest(invest, yearRate, totalmonth); - Map mapPrincipal = new HashMap(); - - for (Map.Entry entry : mapInterest.entrySet()) { - mapPrincipal.put(entry.getKey(), monthIncome.subtract(entry.getValue())); - } - return mapPrincipal; + public static double getPerMonthPrincipal(double invest, int totalMonth) { + BigDecimal monthIncome = new BigDecimal(invest).divide(new BigDecimal(totalMonth), 2, BigDecimal.ROUND_DOWN); + return monthIncome.doubleValue(); } /** - * 等额本息计算获取还款方式为等额本息的总利息 + * 等额本金计算获取还款方式为等额本金的总利息 * * @param invest * 总借款额(贷款本金) @@ -97,27 +238,16 @@ public class AverageCapitalUtils { * 还款总月数 * @return 总利息 */ - public static double getInterestCount(double invest, double yearRate, int totalmonth) { + public static double getInterestCount(double invest, double yearRate, int totalMonth) { BigDecimal count = new BigDecimal(0); - Map mapInterest = getPerMonthInterest(invest, yearRate, totalmonth); + Map mapInterest = getPerMonthInterest(invest, yearRate, totalMonth); - for (Map.Entry entry : mapInterest.entrySet()) { - count = count.add(entry.getValue()); + for (Map.Entry entry : mapInterest.entrySet()) { + count = count.add(new BigDecimal(entry.getValue())); } return count.doubleValue(); } - /** - * 应还本金总和 - * - * @param invest - * 总借款额(贷款本金) - * @param yearRate - * 年利率 - * @param month - * 还款总月数 - * @return 应还本金总和 - */ public static double getPrincipalInterestCount(double invest, double yearRate, int totalmonth) { double monthRate = yearRate / 12; BigDecimal perMonthInterest = new BigDecimal(invest) @@ -128,28 +258,22 @@ public class AverageCapitalUtils { return count.doubleValue(); } - /** - * @param args - */ - public static void main(String[] args) { - double invest = 38988; // 本金 - int month = 12; - double yearRate = 0.15; // 年利率 - BigDecimal perMonthPrincipalInterest = getPerMonthPrincipalInterest(invest, yearRate, month); - System.out.println("等额本息---每月还款本息:" + perMonthPrincipalInterest); - System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 3)); - System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 6)); - System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 9)); - System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 12)); - System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 15)); - System.out.println("等额本息---每月还款本息:" + getPerMonthPrincipalInterest(invest, yearRate, 18)); - /*Map mapInterest = getPerMonthInterest(invest, yearRate, month); - System.out.println("等额本息---每月还款利息:" + mapInterest); - Map mapPrincipal = getPerMonthPrincipal(invest, yearRate, month); - System.out.println("等额本息---每月还款本金:" + mapPrincipal); - double count = getInterestCount(invest, yearRate, month); - System.out.println("等额本息---总利息:" + count); - double principalInterestCount = getPrincipalInterestCount(invest, yearRate, month); - System.out.println("等额本息---应还本息总和:" + principalInterestCount);*/ + /** + * @param args + */ + public static void main() { + double invest = 10000; // 本金 + int month = 12; + double yearRate = 0.015; // 年利率 + Map getPerMonthPrincipalInterest = getPerMonthPrincipalInterest(invest, yearRate, month); + System.out.println("等额本金---每月本息:" + getPerMonthPrincipalInterest); + double benjin = getPerMonthPrincipal(invest, month); + System.out.println("等额本金---每月本金:" + benjin); + Map mapInterest = getPerMonthInterest(invest, yearRate, month); + System.out.println("等额本金---每月利息:" + mapInterest); + double count = getInterestCount(invest, yearRate, month); + System.out.println("等额本金---总利息:" + count); + double principalInterestCount = getPrincipalInterestCount(invest, yearRate, month); + System.out.println("等额本金---应还本息总和:"+principalInterestCount); + } } -}