今天和一个在银行做贷款的朋友聊了一会,顺便问了一下贷款的计算公式。一时兴起就写了计算的存储过程。
计算月还款的小过程(二):http://blog.itpub.net/post/468/27440
计算月还款的小过程(三):http://blog.itpub.net/post/468/27549
公式:
等额本金还款法:
每月还贷本息额=贷款本金/消费月数+(本金-累计已还本金)×月利率。
(其中当月应还本金=贷款本金/消费月数
当月应还利息=(本金-累计已还本金)×月利率)
等额本息还款法:
每月应还本息= P×I(1+I)^N/[(1+I)^N-1]
(其中,P为本金,I为月利率,N为期数,
当期应还利息=P ’ ×I=贷款当期帐面本金*月利率
当期应还本金(P ’)=每月应还本息(P×I(1+I)N/[(1+I)N-1])-当期应还利息
代码:
SQL> CREATE OR REPLACE FUNCTION F_PAY_MONTHLY
2 (
3 P_TOTAL IN NUMBER, P_YEARS IN NUMBER, P_RATE_YEAR IN NUMBER DEFAULT 0.0504,
4 P_TYPE NUMBER DEFAULT 1, P_MONTH_RETURN IN NUMBER DEFAULT 1
5 ) RETURN NUMBER AS
6 V_RATE_MONTH NUMBER := P_RATE_YEAR / 12;
7 V_MONTHES NUMBER := P_YEARS * 12;
8 BEGIN
9 IF P_TYPE = 1 THEN
10 RETURN P_TOTAL * V_RATE_MONTH * POWER(1 + V_RATE_MONTH, V_MONTHES)/(POWER(1 + V_RATE_MONTH, V_MONTHES) - 1);
11 ELSE
12 IF P_MONTH_RETURN > V_MONTHES THEN
13 RETURN 0;
14 END IF;
15 RETURN P_TOTAL/V_MONTHES + (P_TOTAL - P_TOTAL * P_MONTH_RETURN / V_MONTHES)* V_RATE_MONTH;
16 END IF;
17 END;
18 /
函数已创建。
下面简要说明一下:
计算等额本息,20年贷款200000,年利息5.04%,月还款:
SQL> SELECT F_PAY_MONTHLY(200000, 20) FROM DUAL;
F_PAY_MONTHLY(200000,20)
------------------------
1324.33485
计算等额本息,30年贷款400000,年利息5.31%,月还款:
SQL> SELECT F_PAY_MONTHLY(400000, 30, 0.0531) FROM DUAL;
F_PAY_MONTHLY(400000,30,0.0531)
-------------------------------
2223.70326
计算等额本金,15年贷款300000,年利息5.51%,第1、90、180个月分别还款:
SQL> SELECT F_PAY_MONTHLY(300000, 15, 0.0551, 0, 1) FROM DUAL;
F_PAY_MONTHLY(300000,15,0.0551,0,1)
-----------------------------------
3036.51389
SQL> SELECT F_PAY_MONTHLY(300000, 15, 0.0551, 0, 90) FROM DUAL;
F_PAY_MONTHLY(300000,15,0.0551,0,90)
------------------------------------
2355.41667
SQL> SELECT F_PAY_MONTHLY(300000, 15, 0.0551, 0, 180) FROM DUAL;
F_PAY_MONTHLY(300000,15,0.0551,0,180)
-------------------------------------
1666.66667
SQL> SELECT F_PAY_MONTHLY(300000, 15, 0.0551, 0, 181) FROM DUAL;
F_PAY_MONTHLY(300000,15,0.0551,0,181)
-------------------------------------
0
由于时间关系,只是实现了一个最简单的小过程。
过两天会把修改利息和提前还款实现。