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

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为贷款总月数。

  • 公式推导:假设每个月还款金额为Bf(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)=0f(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;
        }
    }
    
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值