等额本息还款计划的计算方式

2023-10-24 11:30

本文主要是介绍等额本息还款计划的计算方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

每月还款计算方式

        等额本息的特点是每期还款额固定,由本金与利息组成,设为A

        设贷款总额为a_{0},还款总期数为N,月利率为x,年利率为X=12x,则有

        从第一期还款日之后每期欠款余额为a_{1}\sim ~a_{N}

        第k期还款前产生的利息为a_{k-1}x,总欠款余额为a_{k-1}(1+x)

        第k期还款后的总欠款余额为a_{k}=a_{k-1}(1+x)-A

        第N期后还完贷款,此时a_{N}=a_{N-1}(1+x)-A=0

        由上可得方程组

\left\{\begin{matrix} a_{1}=a_{0}(1+x)-A\\ a_{2}=a_{1}(1+x)-A\\ ...\\ a_{N}=a_{N-1}(1+x)-A \end{matrix}\right.

        其中前三期还款后的总欠款余额为

                a_{1}=a_{0}(1+x)-A

                a_{2}=a_{1}(1+x)-A=a_{1}(1+x)^{2}-A(1+x)-A

                a_{3}=a_{2}(1+x)-A=a_{2}(1+x)^{3}-A(1+x)^{2}-A(1+x)-A

        由数学归纳法得

                 a_{n}=a_{n-1}(1+x)-A=a_{0}(1+x)^{n}-A(1+x)^{n-1}-A(1+x)^{n-2}-...-A

        由等比数列求和公式得

                A(1+x)^{n-1}+A(1+x)^{n-2}+...+A=A\frac{1-(1+x)^{n}}{1-(1+x)}=A\frac{(1+x)^{n}-1}{x}

        所以第n期还款后的总欠款余额

a_{n}=a_{0}(1+x)^{n}-A\frac{(1+x)^{n}-1}{x}=(a_{0}-\frac{A}{x})(1+x)^{n}+\frac{A}{x}\, \, \, \, (1\leqslant n\leqslant N)

        并且a=0a=1时也成立

        则有第N期(最后一期)还款后的总欠款余额

                a_{N}=(a_{0}-\frac{A}{x})(1+x)^{N}+\frac{A}{x}=0

        由方程组可得方程

(a_{0}-\frac{A}{x})(1+x)^{N}+\frac{A}{x}=0

a_{0}(1+x)^{N}-\frac{A}{x}(1+x)^{N}+\frac{A}{x}=0

a_{0}(1+x)^{N}=\frac{A}{x}[(1+x)^{N}-1]

A=a_{0}\frac{(1+x)^{N}x}{(1+x)^{N}-1}

        解得每期还款额

                A=a_{0}\frac{(1+x)^{N}x}{(1+x)^{N}-1}

        还款总额为

                A_{0}=NA=a_{0}N\frac{(1+x)^{N}x}{(1+x)^{N}-1}

        每期还款额中的利息为

                b_{n}=a_{n-1}x=[(a_{0}-\frac{A}{x})(1+x)^{n-1}+\frac{A}{x}]x=(a_{0}x-A)(1+x)^{n-1}+A

                        =a_{0}x(1+x)^{n-1}-A(1+x)^{n-1}+A=a_{0}x(1+x)^{n-1}+A\left [1-(1+x)^{n-1}\right ]

                        =a_{0}\frac{(1+x)^{N}(1+x)^{n-1}x-(1+x)^{n-1}x}{(1+x)^{N}-1}+a_{0}\frac{(1+x)^{N}x-(1+x)^{N}(1+x)^{n-1}x}{(1+x)^{N}-1}

                        =a_{0}\frac{x\left [(1+x)^{N}-(1+x)^{n-1}\right ]}{(1+x)^{N}-1} \left ( 1\leqslant n\leqslant N \right )

        每期还款额中的本金为

                c_{n}=A-a_{n-1}x=A-\left [ (a_{0}x-A)(1+x)^{n-1}+A \right ]

                        =(A-a_{0}x)(1+x)^{n-1}=\left [ a_{0}\frac{(1+x)^{N}x}{(1+x)^{N}-1}-a_{0}x \right ](1+x)^{n-1}

                        = a_{0}\frac{x}{(1+x)^{N}-1}(1+x)^{n-1}=a_{0}\frac{x(1+x)^{n-1}}{(1+x)^{N}-1}\: \: \: \: \left ( 1\leqslant n\leqslant N \right )

        注意:月利率x、总还款期数N、总贷款额度a_{0}为自变量,每期还款额A为因变量,所以不能在计算其它数据时带入每期还款额A

小数点的影响

        上式中的各个等式在数学上是成立的,但是在实际中存在小数点的问题,所以每个公式都应该用\approx来表示而不是=

        并且最后一期还款额中的本金可能不再是

        ​​​​​​​        c_{N}=a_{0}\frac{x(1+x)^{N-1}}{(1+x)^{N}-1}

        而是a_{0}减去前N-1次还款额中的本金之和,即

                c_{N}=a_{0}-\left ( c_{1}+c_{2}+...+c_{N-1} \right )

15万的等额本息贷款

问:若贷款总额150000元,年利率(单利)为3.6%,不调整利率,按月还款总期数为36,还款方式为等额本息,则每月应还多少元?

解:当x=0.003a_{0}=150000N=36时,有

        每期还款额

                A=a_{0}\frac{(1+x)^{N}x}{(1+x)^{N}-1}=150000\times \frac{1.113867644352453150389\times 0.003}{1.113867644352453150389-1}

                        =150000\times \frac{0.003341602933057359451}{0.113867644352453150389}=150000\times0.0293463779993

                        =4401.9566998955\approx 4401.96

        第一期还款额中的利息为

                b_{1}=a_{0}x=150000\times 0.003=450

        第二期还款额中的利息为

                b_{2}=a_{1}x=\left ( a_{0}+a_{0}x-A \right )x=a_{0}x\left ( 1+x \right )-Ax

                        =450\times1.003-4401.9566998955\times0.003=438.14412990031

        ​​​​​​​        ​​​​​​​        \approx 438.14

        不过银行通常会耍无赖,第一期的利息是从放款后开始算的。比如4月25日放款给你150000,还款日为每月19日,而第一个月不需要你还款,即5月19日不是你的第一期还款日,6月19日才是你的第一期还款日。那么第一期还款额中的利息是从4月25日开始算到6月19日,此时你的第一期还款额中的利息为

               \overline{b_{1}}=a_{0} \times \frac{55}{30} x=150000\times \frac{55}{30} \times0.003=825        

        不过同样的,因为是4月25日放款给你的,所以最后一期还款日也应该是三年后的4月25日。即在三年后的4月19日是你的倒数第二期还款日,而六天后的25日就是你的最后一期还款日。

        最后一期还款日还款后的本金需要用总贷款额度减去前面所有还款额的本金之和,所以这里需要算出前35次还款额的本金。

        计算太多,这里直接用程序计算出

                c_{N}=a_{0}-\left ( c_{1}+c_{2}+...+c_{N-1} \right )\approx 4388.65 

        那么最后一期还款额中的利息为

                \overline{b_{N}}=c_{N} \times \frac{6}{30} x=4388.65\times \frac{6}{30} \times0.003=2.63319\approx 2.63       

        所以每月应还贷款为4401.96元

使用Python实现计算

        下面使用python写了一个类,用来计算一个等额本息贷款的每期本金、利息等数据。

# 计算等额本息贷款每期还款额
class EqualLoanPayment:mLoanLimit = 0                                             # 总贷款额,一般为100,000~10,000,000mAnnualInterestRate = 0.0000                               # 年利率,一般为3.4%~6.8%,这里要填0.034~0.068mRepaymentPeriods = 0                                      # 还款期数,一般1个月为1期,还3~30年,那就是36~360mMonthlyInterestRate = 0.0000                              # 月利率,一般为年利率/12mRepaymentAmountPI = 0                                     # 每期还款总额,是一个固定值mRepaymentPrincipalPI = []                                 # 每期还款额中的本金,是一个列表mRepaymentInterestPI = []                                  # 每期还款额中的利息,是一个列表mInterestAmount = 0                                        # 总利息额,一般为1,000~5,000,000mInterestRate = 0                                          # 总利息率,一般为0.1~1# 构造函数# loanLimit:总贷款额# annualInterestRate:年利率# repaymentPeriods:总还款期数def __init__(self, loanLimit, annualInterestRate, repaymentPeriods):self.mLoanLimit = loanLimitself.mAnnualInterestRate = annualInterestRateself.mRepaymentPeriods = repaymentPeriodsself.mMonthlyInterestRate = round(annualInterestRate / 12, 4)self.calculate()# 根据所给值计算每期还款额中的本金和利息def calculate(self):# tmp1为(1+x)^Ntmp1 = (1 + self.mMonthlyInterestRate) ** self.mRepaymentPeriodsself.mRepaymentAmountPI = self.mLoanLimit * tmp1 * self.mMonthlyInterestRate / (tmp1 - 1)# 每期还款额保留2位小数self.mRepaymentAmountPI = round(self.mRepaymentAmountPI, 2)for i in range(0, self.mRepaymentPeriods - 1):# 用公式计算每期还款额中的利息,银行眼里只有利息,所以会先算利息tmp2 = self.mMonthlyInterestRate * (tmp1 - ((1 + self.mMonthlyInterestRate) ** i))# 每期还款额中的利息保留2位小数repaymentInterest = round(self.mLoanLimit * tmp2 / (tmp1 - 1), 2)self.mInterestAmount = round(self.mInterestAmount + repaymentInterest, 2)self.mRepaymentInterestPI.append(repaymentInterest)# 用公式计算每期还款额中的本金# tmp4 = self.mLoanLimit * self.mMonthlyInterestRate * ((1 + self.mMonthlyInterestRate) ** i) / (tmp1 - 1)# self.mRepaymentPrincipalPI.append(tmp4)# 实际上应该用还款额减去其中的利息repaymentPrincipal = round(self.mRepaymentAmountPI - repaymentInterest, 2)self.mRepaymentPrincipalPI.append(repaymentPrincipal)# 对于最后一期还款额中的本金,应该用总还款额减去前几次还款额中的本金之和来计算lastRepaymentPrincipal = self.mLoanLimitfor repaymentPrincipal in self.mRepaymentPrincipalPI:lastRepaymentPrincipal = round(lastRepaymentPrincipal - repaymentPrincipal, 2)self.mRepaymentPrincipalPI.append(lastRepaymentPrincipal)# 对于最后一期还款额中的利息,应该用最后一期还款额中的本金乘以月利率lastRepaymentInterest = round(lastRepaymentPrincipal * self.mMonthlyInterestRate, 2)self.mRepaymentInterestPI.append(lastRepaymentInterest)self.mInterestAmount = round(self.mInterestAmount + lastRepaymentInterest, 2)# 计算总利息率self.mInterestRate = round(self.mInterestAmount / self.mLoanLimit, 5)# 打印计算的结果def print(self):print('期数:' + str(self.mRepaymentPeriods) + '    年利率:' + '{:.2%}'.format(self.mAnnualInterestRate)+ '    月利率:' + '{:.2%}'.format(self.mMonthlyInterestRate) + '    贷款额总额:' + str(self.mLoanLimit)+ '    每期还款额:' + str(self.mRepaymentAmountPI) + '    利息总额:' + str(self.mInterestAmount)+ '    总利息率:' + '{:.2%}'.format(self.mInterestRate))repaymentPeriods = ''repaymentPrincipals = ''repaymentInterests = ''for i in range(0, self.mRepaymentPeriods):repaymentPeriods = repaymentPeriods + str(i + 1) + '\t\t\t'if i < len(self.mRepaymentPrincipalPI):repaymentPrincipals = repaymentPrincipals + str(self.mRepaymentPrincipalPI[i]) + '\t\t'else:repaymentPrincipals = repaymentPrincipals + 'NULL\t\t'if i < len(self.mRepaymentInterestPI):repaymentInterests = repaymentInterests + str(self.mRepaymentInterestPI[i]) + '\t\t'else:repaymentInterests = repaymentInterests + 'NULL\t\t'print(repaymentPeriods)print(repaymentPrincipals)print(repaymentInterests)

        使用此类进行计算。

equalLoanPayment = EqualLoanPayment(150000, 0.036, 36)
equalLoanPayment.print()

        结果输出如下。

期数:36    年利率:0.036    月利率:0.003    贷款额总额:150000    每期还款额:4401.96
1			2			3			4			5			6			7			8			9			10			11			12			13			14			15			16			17			18			19			20			21			22			23			24			25			26			27			28			29			30			31			32			33			34			35			36			
3951.96		3963.82		3975.71		3987.63		3999.6		4011.6		4023.63		4035.7		4047.81		4059.95		4072.13		4084.35		4096.6		4108.89		4121.22		4133.58		4145.98		4158.42		4170.9		4183.41		4195.96		4208.55		4221.17		4233.84		4246.54		4259.28		4272.05		4284.87		4297.73		4310.62		4323.55		4336.52		4349.53		4362.58		4375.67		4388.65		
450.0		438.14		426.25		414.33		402.36		390.36		378.33		366.26		354.15		342.01		329.83		317.61		305.36		293.07		280.74		268.38		255.98		243.54		231.06		218.55		206.0		193.41		180.79		168.12		155.42		142.68		129.91		117.09		104.23		91.34		78.41		65.44		52.43		39.38		26.29		13.17

        可以看到能够准确计算各项数据。

        在具体计算时要注意小数点累计导致的结果偏差。

这篇关于等额本息还款计划的计算方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/274837

相关文章

虚拟机与物理机的文件共享方式

《虚拟机与物理机的文件共享方式》文章介绍了如何在KaliLinux虚拟机中实现物理机文件夹的直接挂载,以便在虚拟机中方便地读取和使用物理机上的文件,通过设置和配置,可以实现临时挂载和永久挂载,并提供... 目录虚拟机与物理机的文件共享1 虚拟机设置2 验证Kali下分享文件夹功能是否启用3 创建挂载目录4

linux报错INFO:task xxxxxx:634 blocked for more than 120 seconds.三种解决方式

《linux报错INFO:taskxxxxxx:634blockedformorethan120seconds.三种解决方式》文章描述了一个Linux最小系统运行时出现的“hung_ta... 目录1.问题描述2.解决办法2.1 缩小文件系统缓存大小2.2 修改系统IO调度策略2.3 取消120秒时间限制3

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Mybatis官方生成器的使用方式

《Mybatis官方生成器的使用方式》本文详细介绍了MyBatisGenerator(MBG)的使用方法,通过实际代码示例展示了如何配置Maven插件来自动化生成MyBatis项目所需的实体类、Map... 目录1. MyBATis Generator 简介2. MyBatis Generator 的功能3

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

MYSQL行列转置方式

《MYSQL行列转置方式》本文介绍了如何使用MySQL和Navicat进行列转行操作,首先,创建了一个名为`grade`的表,并插入多条数据,然后,通过修改查询SQL语句,使用`CASE`和`IF`函... 目录mysql行列转置开始列转行之前的准备下面开始步入正题总结MYSQL行列转置环境准备:mysq

Linux(Centos7)安装Mysql/Redis/MinIO方式

《Linux(Centos7)安装Mysql/Redis/MinIO方式》文章总结:介绍了如何安装MySQL和Redis,以及如何配置它们为开机自启,还详细讲解了如何安装MinIO,包括配置Syste... 目录安装mysql安装Redis安装MinIO总结安装Mysql安装Redis搜索Red