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=0f ( 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)n3.代码
/* * @Description: 银行贷款等额本息和等额本金的还款方式 * @Author: szq * @Github: https://github.com/MrQqqq * @Date: 2020-07-01 09:32:19 * @LastEditors: szq * @LastEditTime: 2020-07-01 12:01:45 * @FilePath: \cpp\src\bank_loan.cpp */ #include<iostream> #include<math.h> #include<iomanip> using namespace std; /** * @destription: 等额本息每个月还款额和还款总额(本金加总利息) * @param {type} :principal:本金 months:贷款总月数 rate:年利率 * @return: 没有返回值 */ 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; } /** * @destription: 等额本金每个月还款额和还款总额(本金加总利息) * @param {type} :principal:本金 months:贷款总月数 rate:年利率 * @return: 没有返回值 */ 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;//还款方式,1为等额本息,2为等额本金 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; } }