C++实现银行贷款等额本息和等额本金还款
1.等额本金
概念:等额本金就是每个月还款的本金是相同的,即为贷款金额/贷款月数。
计算公式:
B
=
A
m
o
n
t
h
s
+
a
∗
r
a
t
e
B = \frac{A}{months} + a * rate
B=monthsA+a∗rate 其中B表示当前月的还款额,A表示贷款总额,months表示贷款总月数,a表示剩余本金,rate表示月利率。
2.等额本息
概念:等额本息是每个月利息和本金加起来的金额相等。
计算公式为:
B
=
A
∗
i
∗
(
1
+
i
)
n
(
1
+
i
)
n
−
1
B=\frac{A*i*\left(1+i\right)^n}{(1+i)^n-1}
B=(1+i)n−1A∗i∗(1+i)n 其中B为每个月还的金额,A为贷款总额,i为月利率,n为贷款总月数。
公式推导:假设每个月还款金额为B。f(t)表示第t月还完后的剩余本金。
第一期:
f
(
1
)
=
A
(
1
+
i
)
−
B
f(1) = A(1+i) - B
f(1)=A(1+i)−B 其中A(1+i)是本金加上利息总和,减去B即为第一期还完后剩余的本金。
第二期:
f
(
2
)
=
f
(
1
)
(
1
+
i
)
−
B
f(2) = f(1)(1+i) - B
f(2)=f(1)(1+i)−B .
.
.
最后一期:
f
(
n
)
=
f
(
n
−
1
)
(
1
+
i
)
−
B
f(n) = f(n-1)(1+i)-B
f(n)=f(n−1)(1+i)−B 最后一期还清则
f
(
n
)
=
f
(
n
−
1
)
(
1
+
i
)
−
B
=
0
f(n) = f(n-1)(1+i)-B=0
f(n)=f(n−1)(1+i)−B=0
f
(
n
)
−
B
i
=
f
(
n
−
1
)
(
1
+
i
)
−
B
−
B
i
f(n) - \frac{B}{i} = f(n-1)(1+i) - B - \frac{B}{i}
f(n)−iB=f(n−1)(1+i)−B−iB
f
(
n
)
−
B
i
=
f
(
n
−
1
)
(
1
+
i
)
−
B
i
(
1
+
i
)
f(n) - \frac{B}{i} = f(n-1)(1+i) - \frac{B}{i}(1+i)
f(n)−iB=f(n−1)(1+i)−iB(1+i)
f
(
n
)
−
B
i
=
[
f
(
n
−
1
)
−
B
i
]
(
1
+
i
)
f(n) - \frac{B}{i} = [f(n-1)- \frac{B}{i}](1+i)
f(n)−iB=[f(n−1)−iB](1+i)
f
(
n
)
−
B
i
=
[
f
(
1
)
−
B
i
]
(
1
+
i
)
n
−
1
f(n) - \frac{B}{i} = [f(1)- \frac{B}{i}](1+i)^{n-1}
f(n)−iB=[f(1)−iB](1+i)n−1
将f(n)=0和f(1)代入(10),得到
(
1
+
i
)
n
−
1
∗
[
A
(
1
+
i
)
−
B
−
B
i
]
+
B
i
=
0
(1+i)^{n-1}*[A(1+i)-B-\frac{B}{i}]+\frac{B}{i}=0
(1+i)n−1∗[A(1+i)−B−iB]+iB=0 最后整理得:
B
=
A
∗
i
∗
(
1
+
i
)
n
(
1
+
i
)
n
−
1
B=\frac{A*i*\left(1+i\right)^n}{(1+i)^n-1}
B=(1+i)n−1A∗i∗(1+i)n
3.代码
#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std
;
void average_capital_plus_interest(double principal
,int months
,double rate
){
double total_per_month
;
double total_principal_interest
;
double rate_month
= rate
/ 12;
total_per_month
= principal
* rate_month
* pow(rate_month
+ 1,months
)
/ (pow(rate_month
+ 1,months
) - 1);
total_principal_interest
= total_per_month
* months
;
cout
<< "等额本息还款详情为:" << endl
;
cout
<< "每个月还款额为:" << setiosflags(ios
::fixed
) << setprecision(2) << total_per_month
<< endl
;
cout
<< "还款总额为:" << setiosflags(ios
::fixed
) << setprecision(2) << total_principal_interest
<< endl
;
}
void average_interest(double principal
,int months
,double rate
){
double principal_per_month
= principal
/ months
;
double total_principal_interest
= 0;
double rate_month
= rate
/ 12;
cout
<< "等额本金还款详情为:" << endl
;
for(int i
= 1;i
<= months
;i
++){
double total_per_month
= principal
* rate_month
+ principal_per_month
;
principal
= principal
- principal_per_month
;
cout
<< "第" << i
<< "个月还款金额为:" << setiosflags(ios
::fixed
) << setprecision(2) << total_per_month
<< endl
;
total_principal_interest
+= total_principal_interest
;
}
cout
<< "还款总额为:" << setiosflags(ios
::fixed
) << setprecision(2) <<total_principal_interest
<< endl
;
}
int main(){
double principal
;
double rate
;
double months
;
cout
<< "请输入贷款额度:";
cin
>> principal
;
cout
<< endl
;
cout
<< "请输入贷款期限(单位:月):";
cin
>> months
;
cout
<< endl
;
cout
<< "请输入贷款年利率:";
cin
>> rate
;
cout
<< endl
;
int choice
= 1;
cout
<< "1.等额本息" << endl
;
cout
<< "2.等额本金" << endl
;
cout
<< "请选择还款方式:" ;
cin
>> choice
;
cout
<< endl
;
switch (choice
)
{
case 1:
average_capital_plus_interest(principal
,months
,rate
);
break;
case 2:
average_interest(principal
,months
,rate
);
break;
default:
break;
}
}