C++实现银行贷款等额本息和等额本金还款
1.等额本金
概念:等额本金就是每个月还款的本金是相同的,即为贷款金额/贷款月数。
计算公式:
B=Amonths+a∗rateB = \frac{A}{months} + a * rate B=monthsA+a∗rate
其中B
表示当前月的还款额,A
表示贷款总额,months
表示贷款总月数,a
表示剩余本金,rate
表示月利率。
2.等额本息
概念:等额本息是每个月利息和本金加起来的金额相等。
计算公式为:
B=A∗i∗(1+i)n(1+i)n−1B=\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)−Bf(1) = A(1+i) - B f(1)=A(1+i)−B
其中A(1+i)
是本金加上利息总和,减去B
即为第一期还完后剩余的本金。
第二期:
f(2)=f(1)(1+i)−Bf(2) = f(1)(1+i) - B f(2)=f(1)(1+i)−B
.
.
.
最后一期:
f(n)=f(n−1)(1+i)−Bf(n) = f(n-1)(1+i)-B f(n)=f(n−1)(1+i)−B
最后一期还清则
f(n)=f(n−1)(1+i)−B=0f(n) = f(n-1)(1+i)-B=0 f(n)=f(n−1)(1+i)−B=0
f(n)−Bi=f(n−1)(1+i)−B−Bif(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)−Bi=f(n−1)(1+i)−Bi(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)−Bi=[f(n−1)−Bi](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)−Bi=[f(1)−Bi](1+i)n−1f(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−Bi]+Bi=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−1B=\frac{A*i*\left(1+i\right)^n}{(1+i)^n-1} B=(1+i)n−1A∗i∗(1+i)n
3.代码
/** @Description: 银行贷款等额本息和等额本金的还款方式* @Author: szq* @Github: /MrQqqq* @Date: -07-01 09:32:19* @LastEditors: szq* @LastEditTime: -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;}}