一、等额本息

也就是本金+利息每月是相等的,即每月还款额是等额的。

随着占用资金成本的减少所产生的每月利息也会对应减少,在每月还款额不变的情况下,每月需还款本金是递增的。

计算步骤如下:

1.按照推导公式优先计算每月还款额。

每月还款额=(贷款本金月利率*(1+月利率)^还款月数))/((1+月利率)^还款月数-1)

2.根据剩余本金计算当期利息。

利息=剩余本金*月利率

3.计算当期本金。

本金=每月还款额-利息。

4.最后一期使用倒推法先计算本金。

本金=贷款金额-前期合计本金

二、等额本金

本金每月是等额的,随着占用资金成本的减少所产生的每月利息也会对应减少,在本金不变的情况下,每月还款额是逐月递减的。

计算步骤如下:
1.按照推导公式优先计算每月本金。
本金=贷款金额/贷款期数
2.根据剩余本金计算当期利息。
利息=剩余本金*月利率
3.计算每月还款额。
每月还款额=本金+利息
4.最后一期使用倒推法先计算本金。
本金=贷款金额-前期合计本金
5.计算最后一期利息。
利息=剩余本金*月利率
6.计算最后一期还款额。
每月还款额=本金+利息

三、代码实现

计算工具类

public class LoanCalculator {/*** 等额本息计算公式** @param param - 贷款信息*/public static Map<Integer, Loan> calcEqCapitalAndInterest(Param param) {Map<Integer, Loan> result = new TreeMap<>(Comparator.comparingInt(o -> o));// 总贷款期限int loanPeriods = param.getLoanPeriods();// 贷款月利率BigDecimal monthRate = param.getMonthRate();// 每月还款金额BigDecimal monthAmount = calMonthRepayment(param);// 剩余本金BigDecimal balance = param.getLoanAmount();// 出最后一期本金和BigDecimal noneLastCapitalTotal = BigDecimal.ZERO;Loan loan;LocalDate date = ObjectsUtil.isNull(param.getStartRepaymentDate()) ? LocalDate.now() : param.getStartRepaymentDate();// 还款日for (int i = 1; i <= loanPeriods; i++) {loan = new Loan().setPeriod(i).setAmount(monthAmount);// 每月还款金额loan.setInterest(calMonthInterest(balance, monthRate));// 利息=剩余本金*月利率loan.setCapital(monthAmount.subtract(loan.getInterest()));// 本金=每月还款额-利息loan.setCapitalBalance(balance = balance.subtract(loan.getCapital()));// 当期剩余本金loan.setRepaymentDate(date.plusMonths(i - 1));// 还款日result.put(i, loan);if (i != loanPeriods) {noneLastCapitalTotal = noneLastCapitalTotal.add(loan.getCapital());}}// 修正最后一期的数值Loan lastLoan = result.get(loanPeriods);lastLoan.setCapital(param.getLoanAmount().subtract(noneLastCapitalTotal));// 最后一期使用倒推法先计算本金,本金=贷款金额-前期合计本金。lastLoan.setInterest(monthAmount.subtract(lastLoan.getCapital()));// 计算最后一期利息,当期利息=每月还款额-本金。lastLoan.setCapitalBalance(BigDecimal.ZERO);// 最后一期剩余本金为零,剩余的全部加在最后一期本金计算利息return result;}/*** 等额本金计算公式** @param param - 贷款信息*/public static Map<Integer, Loan> calcEqCapital(Param param) {Map<Integer, Loan> result = new TreeMap<>(Comparator.comparingInt(o -> o));// 总贷款期限int loanPeriods = param.getLoanPeriods();// 贷款月利率BigDecimal monthRate = param.getMonthRate();// 每月还款本金BigDecimal monthCapital = calMonthCapital(param);// 剩余本金BigDecimal balance = param.getLoanAmount();Loan loan;LocalDate date = ObjectsUtil.isNull(param.getStartRepaymentDate()) ? LocalDate.now() : param.getStartRepaymentDate();// 还款日for (int i = 1; i <= loanPeriods; i++) {loan = new Loan().setPeriod(i).setCapital(monthCapital);// 本金loan.setInterest(calMonthInterest(balance, monthRate));// 利息=剩余本金*月利率loan.setAmount(loan.getCapital().add(loan.getInterest()));// 每月还款额=本金+利息loan.setCapitalBalance(balance = balance.subtract(monthCapital));// 当期剩余本金loan.setRepaymentDate(date.plusMonths(i - 1));// 还款日result.put(i, loan);}// 修正最后一期的数值Loan lastLoan = result.get(loanPeriods);lastLoan.setCapital(param.getLoanAmount().subtract(monthCapital.multiply(BigDecimal.valueOf(loanPeriods - 1))));// 最后一期使用倒推法先计算本金,本金=贷款金额-前期合计本金。lastLoan.setInterest(calMonthInterest(lastLoan.getCapital(), monthRate));// 计算最后一期利息,利息=剩余本金*月利率。lastLoan.setAmount(lastLoan.getCapital().add(lastLoan.getInterest()));// 计算最后一期还款额,每月还款额=本金+利息。lastLoan.setCapitalBalance(BigDecimal.ZERO);// 最后一期剩余本金为零,剩余的全部加在最后一期本金计算利息return result;}/*** 计算等额本息还款月供** @param param 贷款信息包含贷款金额、年利率、期限* @return 等额本息还款月供*/private static BigDecimal calMonthRepayment(Param param) {BigDecimal totalRate = param.getMonthRate().add(BigDecimal.ONE);return fromMetadata(param.getLoanAmount().multiply((param.getMonthRate().multiply(totalRate.pow(param.getLoanPeriods()))).divide(totalRate.pow(param.getLoanPeriods()).subtract(BigDecimal.ONE), RoundingMode.HALF_EVEN)), 2);}/*** 计算等额本金每月还款本金** @param param 贷款信息包含贷款金额、年利率* @return 等额本金每月还款本金*/private static BigDecimal calMonthCapital(Param param) {return fromMetadata(param.getLoanAmount().divide(new BigDecimal(param.getLoanPeriods()), 2, RoundingMode.HALF_EVEN), 2);}/*** 计算利息** @param restCapital 剩余本金* @param monthRate   月利率* @return 当期利息*/private static BigDecimal calMonthInterest(BigDecimal restCapital, BigDecimal monthRate) {return fromMetadata(restCapital.multiply(monthRate), 2);}/*** 银行家算法截取指定位数** @param bigDecimal 待格式化数据* @param digit      截取位数*/static BigDecimal fromMetadata(BigDecimal bigDecimal, int digit) {return bigDecimal.setScale(digit, RoundingMode.HALF_EVEN);}
}

辅助类

/*** 贷款数据计算参数*/
@Getter
@Setter
public class Param {private final static BigDecimal monthTimes = new BigDecimal("12");/*** 贷款金额*/private BigDecimal loanAmount;/*** 贷款年利率*/private BigDecimal yearRate;/*** 贷款期限(月)*/private int loanPeriods;/*** 首期还款日*/private LocalDate startRepaymentDate = LocalDate.now();public BigDecimal getMonthRate() {return LoanCalculator.fromMetadata(yearRate.divide(monthTimes, 8, RoundingMode.HALF_EVEN), 8);}
}
/*** 贷款信息*/
@ToString
@Getter
@Setter
@Accessors(chain = true)
public class Loan implements Serializable {private static final long serialVersionUID = 1L;/*** 期数*/private Integer period;/*** 还款日*/private LocalDate repaymentDate;/*** 月还款金额*/private BigDecimal amount;/*** 月还款本金*/private BigDecimal capital;/*** 月还款利息*/private BigDecimal interest;/*** 剩余应还本金*/private BigDecimal capitalBalance;
}

住房贷款等额本息(等额本金)还款计划计算相关推荐

  1. LPR/IRR/APR/PMT/PV/FV区分,excel中PMT/PV/FV运用,等额本息/等额本金excel计算器

    一.IRR/ARR,PV/NPV/FV.PMT/PPMT/IPMT.LPR基础含义 1.LPR.IRR/ARR/EAR.APR. (1)LPR 英文释义 Loan Prime Rate,指贷款市场报价 ...

  2. 购房贷款 等额本息 等额本金

    购房贷款主要有两种方式:等额本息贷款和等额本金贷款.这两种方式最大的不同在于计算利息的方式不同.前者采用的是复合方式计算利息(即本金和利息都要产生利息),后者采用简单方式计算利息(即只有本金产生利息) ...

  3. 房贷还款方式等额本息等额本金比较和这两种提前还款的区别

    计算规则数据:贷款总额80万,年限30年,商贷利率5.44 (实际5.4%先按5.44模拟计算) 等额本息: 每月还款:4512.24元 利息总额82.44万元 还款总额:162.44万元 月供总额不 ...

  4. 贷款买房,利息怎么算?等额本金与等额本息

    一.房屋贷款 公积金贷款或商业贷款 1, 年化利率6% 月利率为0.5% 2, 贷款12万元 1年还清 12期 3,错误的算法,利息:12万元*6%=0.72万元 二.等额本金 1, 本金:12万元/ ...

  5. 房贷利率有无套路?Python解读“等额本金与等额本息”的差异所在

    作者 | xiaoyu 来源 | Python数据科学 很多朋友留言说不知道房贷利率的不同归还方式是不是有套路,内心深表疑虑.我的第一反应是因为房贷很高,大家看到消费分期的套路自然而然就想到了房贷,很 ...

  6. python等额本息和等额本金_用Python解读房贷利率,要不要看随你

    可能很多买过房.贷过款的朋友大概都知道怎么回事,但是我相信大部分人也没细研究过,而绝大部分人买房时更是任由房屋中介摆布,因为给了中介费相信他们可以算的明明白白,自己也就不过多深究了.但我觉得买房不是小 ...

  7. Python计算等额本息贷款和等额本金贷款

    题目: 编写函数loanCalculator,根据参数返回每个月贷款详细信息和利息总额,具体要求如下: 1.参数包括:贷款额度.贷款期限.年利率(默认4.35%)和还款方式(1表示等额本金贷款,2表示 ...

  8. 房贷中的等额本息和等额本金有什么区别?

    众所周知房贷有两种还款方式,一种是等额本息,另一种是等额本金.顾名思义,等额本息的意思就是说每期还款的本金和利息是相同的,等额本金就是说每期还款的本金是一样的,而利息是依次递减.下面我们通过一个例子来 ...

  9. 银行贷款等额本息,等额本金计算

    等额本息: /**** @param 本金 单元(元) 1000000(一百万)* @param 年利率 0.0635(6.35%)* @param 还款期限 单元(年) 10(10年)*/publi ...

  10. Java计算等额本金和等额本息

    Java计算等额本金和等额本息 等额本金 等额本息 等额本金 /*** 等额本金是指一种贷款的还款方式,是在还款期内把贷款数总额等分,每月偿还同等数额的本金和剩余贷款在该月所产生的利息,这样由于每月的 ...

最新文章

  1. utf8汉字编码16进制对照(转载)
  2. ACM Smallest Difference
  3. macpro台式计算机,Mac Pro正式上架 真的可以用来刨土豆丝
  4. mathematica打包java_从Mathematica到Java的图像
  5. 谷歌翻译 google translation api
  6. Python异常捕获及自定义异常类
  7. 常用的对联广告带关闭功能
  8. 多通道卷积的参数数量计算
  9. 从0开始构建自己的前端知识体系-JS-事件-键盘事件总结
  10. 2.3 Hadoop安装与体验
  11. 《C Primer Plus(第6版)中文版》一2.12 编程练习
  12. 内存屏障 - MemoryBarrier
  13. springboot实现word转pdf
  14. 制作可被svchost调用的服务(下)
  15. ZJUT 2012校赛决赛-涂颜色
  16. 安卓权限工具类(二)
  17. 食物链 (种类并查集)
  18. SEO的外链与描文本该如何添加?
  19. POJ 1575 Easier Done Than Said?
  20. c语言第十五周答案,C语言考前练习试题及答案

热门文章

  1. 作为攻城狮怎能没博客!!
  2. Python面向对象加强1.关于经典类、新式类和property详解
  3. 虚拟服务器 要备案吗,更换虚拟主机之后需要重新备案吗?
  4. Android解决“此用户无法使用开发者选项“异常
  5. 互联网寒冬怎么过?一程序员裸辞之后,找不到理想的工作,慌的很
  6. win10,设定「键盘布局」为【日语键盘(106/109)】【英语键盘(101/102)】
  7. 泛微云桥任意文件读取漏洞复现[09/18]
  8. 前端分页(详细步骤)
  9. 月薪3k能买到什么样的房子,看到结果后,我裂开了。。。
  10. mysql 表间关联查询