用JAVA不失精度计算等额本息还款列表
用JAVA不失精度计算等额本息还款列表
- 还款公式推导
- 公式
- 代码
- 运行结果
还款公式推导
此处纯属娱乐 可忽略
设贷款总额为A,银行月利率为β,总期数为m(个月),月还款额设为X,则各个月所欠银行贷款为:
第一个月A(1+β)-X
第二个月(A(1+β)-X)(1+β)-X=A(1+β)2-X[1+(1+β)]
第三个月((A(1+β)-X)(1+β)-X)(1+β)-X =A(1+β)3-X[1+(1+β)+(1+β)2] …
由此可得第n个月后所欠银行贷款为 A(1+β)n –X[1+(1+β)+(1+β)2+…+(1+β)(n-1)]= A(1+β)n –X[(1+β)n - 1]/β
由于还款总期数为m,也即第m月刚好还完银行所有贷款,
因此有 A(1+β)m –X[(1+β)m - 1]/β=0
由此求得 X = Aβ(1+β)m/[(1+β)m - 1]
公式
这个还是有用的,下面计算的时候会用到,尤其是每月还款额的公式,其他三个可用可不用。
每月还款额=[总本金×月利率×(1+月利率)还款月数] ÷ [(1+月利率)总期数-1]
每月应还利息=总本金×月利率×[(1+月利率)还款月数-(1+月利率)(还款月序号-1)]÷[(1+月利率)还款月数-1]
每月应还本金=总本金×月利率×(1+月利率)(还款月序号-1)÷[(1+月利率)还款月数-1]
总利息=[总期数×贷款本金×月利率×(1+月利率)还款月数]÷[(1+月利率)还款月数-1]-总本金
或者
总利息=月还本息×总期数-总本金
代码
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Calendar;public class InterestCalculation {static int DECIMAL_SCALE = 9;static BigDecimal BIGDECAMAL_100 = new BigDecimal(100);static BigDecimal BIGDECAMAL_12 = new BigDecimal(12);static BigDecimal BIGDECAMAL_30 = new BigDecimal(30);static BigDecimal BIGDECAMAL_360 = new BigDecimal(360);/*** 等额本息 还款列表计算(自然月,即回款日期与出借日期相同)* @param total 总金额* @param yearRate 年利率* @param sumTerm 总期数* @throws Throwable*/public static void calculation_DEBX_ZRY(BigDecimal total,BigDecimal yearRate,int sumTerm) throws Throwable{BigDecimal monthRate = yearRate.divide(BIGDECAMAL_12,DECIMAL_SCALE, BigDecimal.ROUND_HALF_UP);//每月还款额=[总本金×月利率×(1+月利率)^还款月数]÷[(1+月利率)^总期数-1]BigDecimal tmp = monthRate.add(new BigDecimal(1)).pow(sumTerm);//(1+月利率)^还款月数BigDecimal monthPayTotal = total.multiply(monthRate).multiply(tmp).divide(tmp.subtract(new BigDecimal(1)), 2,BigDecimal.ROUND_HALF_UP);/*总利息 计算总利息有3种方法:1.在循环中将每月应还利息累加2.总利息=月还本息×总期数-总本金3.公式:总利息=[总期数×贷款本金×月利率×(1+月利率)^还款月数]÷[(1+月利率)^还款月数-1]-总本金具体使用哪种根据情况而定,推荐第二种*///2:BigDecimal sumInterest = monthPayTotal.multiply(new BigDecimal(sumTerm)).subtract(total);//3:/*BigDecimal sumInterest = new BigDecimal(sumTerm).multiply(total).multiply(monthRate).multiply(BigDecimal.ONE.add(monthRate).pow(sumTerm)).divide(BigDecimal.ONE.add(monthRate).pow(sumTerm).subtract(BigDecimal.ONE),2,BigDecimal.ROUND_HALF_UP).subtract(total);*/BigDecimal remainTotal = total; //剩余本金付初始值为总本金 BigDecimal monthPrincipal = BigDecimal.ZERO;Calendar calendar = Calendar.getInstance();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");System.out.println("本金:"+total.setScale(2)+"\t年利率:"+yearRate.multiply(BIGDECAMAL_100)+"%\t总期数:"+sumTerm+"\t总利息:"+sumInterest);System.out.println("期次\t回款本息(元)\t回款利息(元)\t回款本金(元)\t剩余本金(元)\t回款日期");for(int i=1;i<=sumTerm;i++){/*每月应还本金和利息也有2种方法:1.公式:每月应还利息=总本金×月利率×〔(1+月利率)^还款月数-(1+月利率)^(还款月序号-1)〕÷〔(1+月利率)^还款月数-1〕每月应还本金=总本金×月利率×(1+月利率)^(还款月序号-1)÷〔(1+月利率)^还款月数-1〕 *//*BigDecimal interest = total.multiply(monthRate).multiply(BigDecimal.ONE.add(monthRate).pow(sumTerm).subtract(BigDecimal.ONE.add(monthRate).pow(i-1))).divide(BigDecimal.ONE.add(monthRate).pow(sumTerm).subtract(BigDecimal.ONE),2,BigDecimal.ROUND_HALF_UP);monthPrincipal = total.multiply(monthRate).multiply(BigDecimal.ONE.add(monthRate).pow(i-1)).divide(BigDecimal.ONE.add(monthRate).pow(sumTerm).subtract(BigDecimal.ONE),2,BigDecimal.ROUND_HALF_UP);*///2.月还利息=剩余本金×月利率//月还本金=月还本息-月还利息 //具体使用哪种根据喜好而定,第二种更容易理解BigDecimal interest = remainTotal.multiply(monthRate).setScale(2,BigDecimal.ROUND_HALF_UP);//为避免因精度损失产生误差,最后一期 还款利息=月还本息-剩余本金 //为避免利息产生负数的情况出现 当利息小于等于0时利息赋值为0.1元if (sumTerm == i) {interest = monthPayTotal.subtract(remainTotal);if(interest.compareTo(BigDecimal.ZERO)<=0){interest=new BigDecimal(1).divide(new BigDecimal(10),2,BigDecimal.ROUND_HALF_UP);}} //月还本金=月还本息-月还利息monthPrincipal = monthPayTotal.subtract(interest);remainTotal = remainTotal.subtract(monthPrincipal);calendar.add(Calendar.MONTH, 1);System.out.println(i+"\t"+monthPayTotal+"\t\t"+interest+"\t\t"+monthPrincipal+"\t\t"+remainTotal+"\t\t"+sdf.format(calendar.getTime()));}}public static void main(String[] args) throws Throwable {//本金10000元,年利率15%,出借18个月BigDecimal total = new BigDecimal(10000);BigDecimal yearRate = BigDecimal.valueOf(0.15);int sumTerm = 18;calculation_DEBX_ZRY(total,yearRate,sumTerm); }
运行结果
本金:10000.00 年利率:15.00% 总期数:18 总利息:1229.30
期次 回款本息(元) 回款利息(元) 回款本金(元) 剩余本金(元) 回款日期
1 623.85 125.00 498.85 9501.15 2019-06-12
2 623.85 118.76 505.09 8996.06 2019-07-12
3 623.85 112.45 511.40 8484.66 2019-08-12
4 623.85 106.06 517.79 7966.87 2019-09-12
5 623.85 99.59 524.26 7442.61 2019-10-12
6 623.85 93.03 530.82 6911.79 2019-11-12
7 623.85 86.40 537.45 6374.34 2019-12-12
8 623.85 79.68 544.17 5830.17 2020-01-12
9 623.85 72.88 550.97 5279.20 2020-02-12
10 623.85 65.99 557.86 4721.34 2020-03-12
11 623.85 59.02 564.83 4156.51 2020-04-12
12 623.85 51.96 571.89 3584.62 2020-05-12
13 623.85 44.81 579.04 3005.58 2020-06-12
14 623.85 37.57 586.28 2419.30 2020-07-12
15 623.85 30.24 593.61 1825.69 2020-08-12
16 623.85 22.82 601.03 1224.66 2020-09-12
17 623.85 15.31 608.54 616.12 2020-10-12
18 623.85 7.73 616.12 0.00 2020-11-12
还要说一下,说的不失精度只是用BigDecimal计算损失的精度较小,但是并不能保证完全不损失精度。尤其是在用年利率计算月利率的时候一定要尽可能的多保留小数位数,不然差之毫厘谬以千里啊~
本来还想算一下固定日回款的等额本息列表的,但是发现这种情况好像在实际中应用比较少,而且规则各不相同。有固定日回款本息金额与自然月回款相同只是日期延后的,有多的那几天利息在第一期算的,还有在最后一期算的,还有多的那几天利息平均到每期的。逻辑各不相同,所以写不下去了,随机应变吧~
在这里还想提醒各位小伙伴一下,有的贷款比如银行的现金分期看着像等额本息,但实际上大部分都不是按照每期的剩余本金算利息的,而是按照分期时候的全部本金算利息,而你的钱并没有全额使用那么长时间。所以,小伙伴们以后如果分期最好还是自己算一下到底划不划算~
准备下一篇写等额本金的,先息后本的太简单就不写了~
用JAVA不失精度计算等额本息还款列表相关推荐
- JAVA计算等额本金还款列表
JAVA计算等额本金还款列表 公式 代码 运行结果 等额本金计算还款列表的代码来了~ 公式 月还本息=(本金/还款月数)+(本金-累计已还本金)×月利率 每月本金=总本金/还款月数 每月利息=(本金- ...
- Java根据日利率计算等额本息每月还款
问题描述 等额本息分期贷款,大多数时候借款日和还款日不一定相同(例如支付宝借呗),并且每期(每月)天数不同,比如二月份是28天,29天,其他月份有31天或者30天,此时产生的一个问题就是每期的还款日相 ...
- java 模拟贷款实现等额本息还款
还是菜鸟的我,在学习完java面向对象的思想后编写了一个模拟贷款的程序!! 一.首先创建一个类用于给变量赋值和输出. 代码如下: public class Loan {private double m ...
- NO.87 提前还款or买火鸡?(捎带举例JAVA Double精度计算问题)
(如有谬误,敬请指正--) 现在我身上有一笔30万10年基准利率(6.55)的贷款,压力不大(每月等额本息还款3414.08元),于是每月工资留出一部分买了火鸡(货币基金:我买的那个收益年化约4.5, ...
- 写一个MySql存储过程实现房贷等额本息还款计算(另外附javascript代码)
写一个MySql存储过程实现房贷等额本息还款计算 MySql存储过程代码如下: DROP procedure IF EXISTS `calc_equal_interest_proc`;DELIMITE ...
- 等额本息还款和等额本金还款计算公式的推导
VBA代码实现:http://blog.csdn.net/xiaotao_liu/archive/2008/02/27/2124452.aspx 众所周知,银行住房贷款的分期付款方式分为等额本息付款和 ...
- 等额本息还款法贷款利息计算方法及还款计划
贷款后一般有两种方法还款:等额本金.等额本息,对于房奴一族来说,买房后手头余粮无几,只得选择等额本息还款,尽管等额本金在相同期数的情况下还款能节省不少的利息. 等额本息对还款人来说很简单,就是每个月还 ...
- 等比序列的实际应用 —等额本息还款金额公式推导
缘起 等额本息是买房按揭贷款时最常用的一种还款方式,其意义从字面就可以理解,就是每期还款的本金加利息之和相等.我们在计算每期应还本金和利息时,在Excel中可以方便的使用函数PMT(rate,nper ...
- 用c语言实现银行贷款程序(等额本息还款法、等额本金还款法)
王先生从银行贷了350,000元用于买房,贷款期限为20年 ⑴用等额本息还款法,计算每月应还本息(每月月供).20年总利息 ⑵用等额本金还款法,计算每月应还本息(每月月供).20年总利息? ⑶比较两种 ...
- 某用户为购房办理商业贷款,选择了按月等额本息还款法,计算公式如下,在贷款本金(loan)和月利率(rate)一定的情况下,住房贷款的月还款(money)取决于还款月数(month)
#include<stdio.h> #include<math.h> int main() {int l,c,month;float money;double r;printf ...
最新文章
- CSW是怎样用极端化来分裂BCH社区的
- ssrf 服务器端请求伪造 简介
- GDB调试基础操作详解【GDB调试】
- boost::statechart模块自定义反应测试相关的测试程序
- JQuery Show()的几种效果
- Docker容器虚拟化技术---Docker运维管理(Docker Compose)4
- nginx配置和前端跨域问题
- HDU 2144 (最长连续公共子列 + 并查集) Evolution
- MySQL:Innodb表 Data free 的计算概要
- 调试mysql语句_Mysql sql 语句调试
- 对象 替换_JVM 对象分配过程
- Hadoop 入门教程(超详细)
- 01-----YUV各种格式的详解
- ffmpeg x264编码参数
- 【php环境搭建/wamp/解释器/下载】
- 成都开发者看过来!百度资深研发工程师将出席超级账本成都见面会
- mac 软件卸载后无法安装
- 门禁卡,IC卡破解复制
- 3分钟了解伺服驱动器的工作原理
- 分体式降噪耳机哪个好用?入耳式降噪耳机排行榜!