本文分享自华为云社区《房贷计算器-从原理、计算到提前还款和可视化-云社区-华为云》,作者:蜉蝣与海。

可以看到抽象出公共结构后,前后的计算结果并没有发生变化。
考虑年限不变提前还款的情况,这里将每次提前还款的时间和金额组成python的元组,若干个(账期,还款金额)元组组成一个list输入函数。函数首先计算正常情况下的还款信息,而后根据提前还款信息,修改提前还款日的剩余本金,并从各个提前还款日重新计算剩余还款。
defextraPaidWithFixedPeriod(months,principal,rate,capitalAveraged,extraPaidList:list):capitals,interests,total_payment=normalPaid(months,principal,rate,capitalAveraged)(key=lambdax:x[0])originCapital,originInterests,originTotal=(),(),total_()left_principal=[0]*monthsleft_principal[0]=principalforxinrange(0,months):ifxmonths-1:left_principal[x+1]=left_principal[x]-capitals[x]defnormalPaidOffset(left_months,principal,rate,capitalAveraged,offset):month_rate=rate/12monthly_capital=left_principal[offset]/left_monthsmonthly_payment=left_principal[offset]*month_rate*(1+month_rate)**left_months/((1+month_rate)**left_months-1)foriinrange(0,left_months):interests[offset+i]=left_principal[offset+i]*month_rateifcapitalAveraged:capitals[offset+i]=monthly_capitaltotal_payment[offset+i]=monthly_capital+interests[offset+i]else:total_payment[offset+i]=monthly_paymentcapitals[offset+i]=total_payment[offset+i]-interests[offset+i]ifi==0:print("次月还款%.2f"%total_payment[offset+i])ifoffset+i+1months:left_principal[offset+i+1]=left_principal[offset+i]-capitals[offset+i]returnforx,yinextraPaidList:capitals[x]=capitals[x]+yleft_principal[x+1]=left_principal[x]-capitals[x]total_payment[x]=capitals[x]+interests[x]print("当月需还%.f剩余本金%.f"%(total_payment[x],left_principal[x+1]))normalPaidOffset(months-x-1,left_principal[x+1],rate,capitalAveraged,x+1)printStatistics(originCapital,originInterests,originTotal,months)print("")printStatistics(capitals,interests,total_payment,months)print("节省利息%.2f"%((originInterests)-(interests)))returncapitals,interests,total_payment,originTotal,originInterests再定义几个函数对提前还款节省的利息进行可视化。
defdrawDiagramExtraPaid(months,capitals,interests,originalTotal,originalInterests,showOriginTotal=True):month_array=(1,months+1,1)capital_with_origin_interest=[0]*monthsheight=interestsforxinrange(1,months):capital_with_origin_interest[x]=capitals[x]+originalInterests[x]l1=(month_array,originalTotalifshowOriginTotalelsecapital_with_origin_interest,width=0.2,align='center',color='yellow')l2=(month_array,capitals,width=0.2,align='center',color='red')l3=(month_array,interests,width=0.2,align='center',color='blue',bottom=capitals)华为云开发者联盟#
