按揭貸款的計算原理與java實現

Number部分(6) Mortgage Calculator--按揭貸款計算器

題目描述:

Mortgage Calculator – Calculate the monthly payments of a fixed term mortgage over given Nth terms at a given interest rate. Also figure out how long it will take the user to pay back the loan.java

題目翻譯:

按揭貸款計算器——在給定利率下,計算固按期限按揭貸款在第N期的月還款。同時計算用戶須要多長時間來償還貸款。函數

按揭貸款的相關概念(Mortgage)

  1. 什麼是按揭貸款
    抵押貸款是指提供私人資產做爲債務擔保進行借款,多發生於購買房地產時英航借出的抵押貸款。spa

  2. 抵押貸款的類型
    抵押貸款的類型有多種,主要經過一下幾個因素來定義抵押貸款的類型。翻譯

    • 利率(interest) :分爲固定利率和浮動利率
    • 期限(Term) :按揭貸款一般擁有最大還款期限
    • 還款數額與還款頻率(Payment amount and frequency) :規定兩次還款之間的時間間隔以及在每一個週期內須要還款的數目
    • 預付款(PrePayment):貸款方提早支付的預付款
  3. 還款方式
    按揭貸款通常採用分期還款,在固定匯率的狀況下,規定一個還款期限,而後每個月按時還必定數額。
    常見的兩種還款方式:等額本息還款和等額本金還款
    兩種還款方案每個月還款金額計算以下:
    假定貸款的年利率爲r,還款年限爲Y年,貸款本金爲P,每個月還款金額爲A
    貸款的月利率\(R =r/12\), 還款期數爲\(N=12Y\)rest

    • 等額本息還款:
      等額本息還款是指在還款時,每月總的還款金額是相同的。每個月所還本金和所還利息是變化的
      假定第t個還款月還款後,剩餘的總還款金額爲 \(p(t)\).code

      \[\begin{aligned} &p(0)=P\\ &p(1)=p(0)(1+R)-A=P(1+R)-A\\ &p(2)=P(1)(1+R)-A=[P(1+R)-A](1+R)-A=P(1+R)^2-(1+R)A-A\\ &...\\ &p(t)=P(1+R)^t-A(1+R)^{t-1}-A(1+R)^{t-2}-...-A(1+R)-A\\ \end{aligned} \]

      咱們能夠獲得每個月還款後剩餘還款金額\(p(t)\)的表達式:ip

      \[\begin{aligned} p(t)&=P(1+R)^t-A\sum_{i=0}^{t-1}(1+R)^i\\ &=P(1+R)^t-A\frac{1-(1+R)^t}{1-(1+R)}\\ &=P(1+R)^t-A\frac{(1+R)^t-1}{R} \end{aligned}\]

      咱們給定的還款期數爲N,也就是說\(p(N)=0\),咱們能夠求出每個月還款數額A。
      由方程ci

      \[\begin{aligned} P(n)=P(1+R)^N-A\frac{(1+R)^N-1}{R}=0\\ \end{aligned}\]

      能夠獲得it

      \[\begin{aligned} A&=\frac{PR(1+R)^N}{(1+R)^N-1}\\ \end{aligned}\]

      也就是說,若是採用等額本息的方式來還款,每個月須要還款的數額爲\(\frac{PR(1+R)^N}{(1+R)^N-1}\)class

      雖然每月的還款數額相同,每個月所還得利息和本金是變化的
      第t+1個還款月須要還的利息\(i(t+1)\),爲該月還款前的剩餘還款金額\(p(t)\)乘以月利率R

      \[\begin{aligned} i(t+1)&=p(t)R\\ &=PR(1+R)^t-A(1+R)^t+A\\ &=(PR-A)(1+R)^t+A\\ &=((PR-A)(1+R)^{t-1}+A)(1+R)-A(1+R)+A\\ &=i(t)(1+R)-AR\\ \end{aligned}\]

      由於\((PR-A)<0\),因此\(i(t)\)是關於t的減函數,也就是說每月的還款金額中,利息所佔的比重是下降的,而本金所佔的比重是上升的

    • 等額本金還款:
      在等額本金還款方式中,每月還款的本金是相同,可是每月所還的利息不一樣,因此每月的還款總金額是變化的。
      每月須要還得本金pr爲總本金除以總的還款月數。

      \[\begin{aligned} pr = \frac{P}{N} \end{aligned}\]

      每月須要還得利息\(pi(t)\) = (本金-已歸還的本金之和)*每個月利率

      \[\begin{aligned} pi(t)& = (P-pr(t-1))R\\ &=-prAt+(A+P)R\\ &=-\frac{PR}{N}t+(\frac{P}{N}+P)R\\ \end{aligned}\]

      能夠看到,每月所還利息\(pi(t)\)是關於t的減函數,說明每月所還的利息是逐漸減小的。因爲每月所還的本金數額不變,因此每月所還貸款總額是遞減的。

程序實現

用戶輸入貸款匯率,貸款總金額,還款的年限和選擇的還款方式。
程序輸出用戶每月須要還款的總金額以及須要償還的本金和利息數額。

import java.util.Scanner;

public class MortgageCalculator{

    public static void mortgageCalcute(double P,double interest,int Y,int type){

        //輸入參數貸款總額P,貸款利率interest,還款年限Y,還款類型type(0表示等額本息還款方式,1表示等額本金還款方式)
        switch(type){
            case 0:
                equalLoanPayment(P,interest,Y);
                break;
            case 1:
                equalPrincipalPayment(P,interest,Y);
                break;
        }
    }

    public static void equalLoanPayment(double P,double interest,int Y){ //等額本息還款計算函數
        int N = Y*12;
        double R = interest/12;
        double A = P*R*Math.pow(1+R,N)/(Math.pow(1+R,N)-1);
        System.out.printf("每個月償還的本息%7.2f\n",A*10000);
        double[] pi = new double[N];
        pi[0] = P*R;
        System.out.printf("第1個月須要償還的利息:%8.2f  第1個月須要償還的本金爲:%7.2f\n",pi[0]*10000,(A-pi[0])*10000);
        for(int i=1;i<N;i++){
            pi[i] = pi[i-1]*(1+R)-A*R;
            System.out.printf("第%d個月須要償還的利息:%7.2f  第%d個月須要償還的本金爲:%7.2f\n",i+1,pi[i]*10000,i+1,(A-pi[i])*10000);

        }

    }
    public static void equalPrincipalPayment(double P,double interest,int Y){ //等額本金還款計算函數

        int N = Y*12; //還款的總月份
        double R = interest/12; //還款的月利率
        double A = P*1.0/N; //每個月須要還得本金
        System.out.printf("每個月須要償還的本金%7.2f\n",A*10000);
        double[] pi = new double[N+1];
        for(int i=1;i<=N;i++){
            pi[i] = -P*R*1.0/N*i+(P/N+P)*R;
            System.out.printf("第%d個月須要償還的利息:%7.2f.第%d個月須要償還的本息:%7.2f\n",i+1,pi[i]*10000,i+1,(pi[i]+A)*10000);
        }


    }
    public static void main(String[] args){
        //equalPrincipalPayment(45.4, 3.25/100, 15);
        Scanner sc = new Scanner(System.in);
        System.out.println("選擇還款方式: 0 等額本息,1 等額本金");
        int PaymentType = sc.nextInt();
        System.out.println("輸入還款總額(單位:萬),還款年利率(百分數)與還款年限,用空格隔開");
        double Payment = sc.nextDouble();
        double interest = sc.nextDouble();
        int years = sc.nextInt();
        sc.close();
        System.out.println("還款總額:"+Payment+"還款年利率:"+interest+"% "+"還款年限:"+years+"年");
        mortgageCalcute(Payment,interest/100,years,PaymentType);
    }
}
相關文章
相關標籤/搜索