等本金和等本息算法
最近做项目,还款计划模块,遇到了等本息和等本金算法,于是查阅了一些关于等本金和等本息的资料,二者区别如下:
1. 等本金还款:
借款人每月偿还的本金固定不变,贷款利息逐月递减的还款方式。其特点是:每月归还贷款本金相等,利息则按贷款本金余额逐月计算,前期还贷金额较大,以后每月还款额逐渐减少。由于还款额是逐月递减,因此每个月的还款额等额本息还款都是不等的。
2. 等本息还款:
把贷款的本金总额与利息总额相加,然后平均分摊到还款期限的每个月中。对还款人来说,每个月偿还固定金额,但每月还款额中的本金比重逐月递增、利息比重逐月递减。
不多说了,直接贴主要方法代码:
代码
1 /// <summary>
2 /// 方式:等本金还款
3 /// </summary>
4 /// <param name="nDeadline">期限</param>
5 /// <param name="fMoney">总金额</param>
6 /// <param name="dRate">年利率</param>
7 /// <returns>交错数组:(1.月还款额,2.月利息)</returns>
8 public static double[][] F_MonthMoney(int nDeadline, double fMoney, double yRate)
9 {
10 double[][] arr = new double[2][];//声明交错数组
11
12 double[] fPrincipal = new double[nDeadline]; //本金
13 double[] fSparePrin = new double[nDeadline];//剩余本金
14 double[] fMonthRate = new double[nDeadline];//月利息
15 double[] fMonthMoney = new double[nDeadline];//月还款额
16
17 for (int i = 0; i < nDeadline; i++)
18 {
19 fPrincipal[i] = fMoney / nDeadline;
20 if (i == 0)
21 {
22 fSparePrin[i] = fMoney - fPrincipal[i];//剩余本金
23 fMonthRate[i] = Math.Round(fMoney * (yRate/12),2);//月利息
24 }
25 else
26 {
27 fSparePrin[i] = fSparePrin[i - 1] - fPrincipal[i];//剩余本金
28 fMonthRate[i] = Math.Round(fSparePrin[i - 1] * (yRate/12),2);//月利息=上个月的剩余本金×利率
29 }
30
31 fMonthMoney[i] = Math.Round(fPrincipal[i] + fMonthRate[i],2);
32 }
33
34 arr[0] = fMonthMoney;//月还款
35 arr[1] = fMonthRate;//月利息
36
37 return arr;
38 }
39 /// <summary>
40 /// 方式:等本息还款
41 /// </summary>
42 /// <param name="nDeadline">期限</param>
43 /// <param name="fMoney">总金额</param>
44 /// <param name="dRate">年利率</param>
45 /// <returns>交错数组:(1.月还款额,2.本金,3.利息)</returns>
46 public static double[][] D_TotalMoney(int nDeadline, double fMoney, double yRate)
47 {
48 double[][] arr = new double[3][];//声明交错数组
49
50 int i;
51 double tlnAcct = 0, tdepAcct = 0;
52
53 double[] lnAcctbal = new double[nDeadline]; /*贷款余额*/
54 double[] depAcctbal = new double[nDeadline]; /*总还款*/
55 double[] payrateAcct = new double[nDeadline]; /*每月应还利息*/
56 double[] payAcct = new double[nDeadline]; /*每月应还款*/
57 double[] paybaseAcct = new double[nDeadline]; /*每月应还本金*/
58
59 tlnAcct = fMoney;
60
61 for (i = 0; i < nDeadline; i++)
62 {
63 paybaseAcct[i] =Math.Round((Math.Pow((1 + yRate/12), i + 1) - Math.Pow((1 + yRate/12), i)) / (Math.Pow((1 + yRate/12), nDeadline) - 1) * fMoney,2);
64 payrateAcct[i] = Math.Round(tlnAcct * yRate/12,2);
65 payAcct[i] =Math.Round(paybaseAcct[i] + payrateAcct[i],2);
66 lnAcctbal[i] = tlnAcct - paybaseAcct[i];
67 depAcctbal[i] = tdepAcct + payAcct[i];
68 tdepAcct = depAcctbal[i];
69 tlnAcct = tlnAcct - paybaseAcct[i];
70 }
71
72 arr[0] = payAcct;//月还款
73 arr[1] = paybaseAcct;//月本金
74 arr[2] = payrateAcct;//月利息
75
76 return arr;
77 }
方法返回交错数组,通过还款期限月数,即可算出相应月数的还款额