C++实现银行贷款等额本息和等额本金还款

    技术2022-07-11  152

    C++实现银行贷款等额本息和等额本金还款

    1.等额本金

    概念:等额本金就是每个月还款的本金是相同的,即为贷款金额/贷款月数。

    计算公式: B = A m o n t h s + a ∗ r a t e B = \frac{A}{months} + a * rate B=monthsA+arate 其中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)n1Ai(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(n1)(1+i)B 最后一期还清则 f ( n ) = f ( n − 1 ) ( 1 + i ) − B = 0 f(n) = f(n-1)(1+i)-B=0 f(n)=f(n1)(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(n1)(1+i)BiB

    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(n1)(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(n1)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)n1

    将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)n1[A(1+i)BiB]+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)n1Ai(1+i)n

    3.代码

    /* * @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; } }
    Processed: 0.012, SQL: 9