住房贷款等额本息(等额本金)还款计划计算
一、等额本息
也就是本金+利息每月是相等的,即每月还款额是等额的。
随着占用资金成本的减少所产生的每月利息也会对应减少,在每月还款额不变的情况下,每月需还款本金是递增的。
计算步骤如下:
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;
}
住房贷款等额本息(等额本金)还款计划计算相关推荐
- 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,指贷款市场报价 ...
- 购房贷款 等额本息 等额本金
购房贷款主要有两种方式:等额本息贷款和等额本金贷款.这两种方式最大的不同在于计算利息的方式不同.前者采用的是复合方式计算利息(即本金和利息都要产生利息),后者采用简单方式计算利息(即只有本金产生利息) ...
- 房贷还款方式等额本息等额本金比较和这两种提前还款的区别
计算规则数据:贷款总额80万,年限30年,商贷利率5.44 (实际5.4%先按5.44模拟计算) 等额本息: 每月还款:4512.24元 利息总额82.44万元 还款总额:162.44万元 月供总额不 ...
- 贷款买房,利息怎么算?等额本金与等额本息
一.房屋贷款 公积金贷款或商业贷款 1, 年化利率6% 月利率为0.5% 2, 贷款12万元 1年还清 12期 3,错误的算法,利息:12万元*6%=0.72万元 二.等额本金 1, 本金:12万元/ ...
- 房贷利率有无套路?Python解读“等额本金与等额本息”的差异所在
作者 | xiaoyu 来源 | Python数据科学 很多朋友留言说不知道房贷利率的不同归还方式是不是有套路,内心深表疑虑.我的第一反应是因为房贷很高,大家看到消费分期的套路自然而然就想到了房贷,很 ...
- python等额本息和等额本金_用Python解读房贷利率,要不要看随你
可能很多买过房.贷过款的朋友大概都知道怎么回事,但是我相信大部分人也没细研究过,而绝大部分人买房时更是任由房屋中介摆布,因为给了中介费相信他们可以算的明明白白,自己也就不过多深究了.但我觉得买房不是小 ...
- Python计算等额本息贷款和等额本金贷款
题目: 编写函数loanCalculator,根据参数返回每个月贷款详细信息和利息总额,具体要求如下: 1.参数包括:贷款额度.贷款期限.年利率(默认4.35%)和还款方式(1表示等额本金贷款,2表示 ...
- 房贷中的等额本息和等额本金有什么区别?
众所周知房贷有两种还款方式,一种是等额本息,另一种是等额本金.顾名思义,等额本息的意思就是说每期还款的本金和利息是相同的,等额本金就是说每期还款的本金是一样的,而利息是依次递减.下面我们通过一个例子来 ...
- 银行贷款等额本息,等额本金计算
等额本息: /**** @param 本金 单元(元) 1000000(一百万)* @param 年利率 0.0635(6.35%)* @param 还款期限 单元(年) 10(10年)*/publi ...
- Java计算等额本金和等额本息
Java计算等额本金和等额本息 等额本金 等额本息 等额本金 /*** 等额本金是指一种贷款的还款方式,是在还款期内把贷款数总额等分,每月偿还同等数额的本金和剩余贷款在该月所产生的利息,这样由于每月的 ...
最新文章
- utf8汉字编码16进制对照(转载)
- ACM Smallest Difference
- macpro台式计算机,Mac Pro正式上架 真的可以用来刨土豆丝
- mathematica打包java_从Mathematica到Java的图像
- 谷歌翻译 google translation api
- Python异常捕获及自定义异常类
- 常用的对联广告带关闭功能
- 多通道卷积的参数数量计算
- 从0开始构建自己的前端知识体系-JS-事件-键盘事件总结
- 2.3 Hadoop安装与体验
- 《C Primer Plus(第6版)中文版》一2.12 编程练习
- 内存屏障 - MemoryBarrier
- springboot实现word转pdf
- 制作可被svchost调用的服务(下)
- ZJUT 2012校赛决赛-涂颜色
- 安卓权限工具类(二)
- 食物链 (种类并查集)
- SEO的外链与描文本该如何添加?
- POJ 1575 Easier Done Than Said?
- c语言第十五周答案,C语言考前练习试题及答案
热门文章
- 作为攻城狮怎能没博客!!
- Python面向对象加强1.关于经典类、新式类和property详解
- 虚拟服务器 要备案吗,更换虚拟主机之后需要重新备案吗?
- Android解决“此用户无法使用开发者选项“异常
- 互联网寒冬怎么过?一程序员裸辞之后,找不到理想的工作,慌的很
- win10,设定「键盘布局」为【日语键盘(106/109)】【英语键盘(101/102)】
- 泛微云桥任意文件读取漏洞复现[09/18]
- 前端分页(详细步骤)
- 月薪3k能买到什么样的房子,看到结果后,我裂开了。。。
- mysql 表间关联查询