前言

房贷,也被称为房屋抵押贷款.

房屋贷款的方式有三种,分别是银行商业贷款公积金贷款组合贷款

总想质疑一下银行的贷款计算器是不是靠谱.故而自己动手写了一个小而简单的计算器,几十行代码

等额本息

等额本息还款法即把按揭贷款本金总额与利息总额相加,然后平均分摊到还款期限的每个月中,每个月的还款额是固定的,但每月还款额中的本金比重逐月递增、利息比重逐月递减。

每个月总偿还金额是不变的.
$$
设:A_n为第n个月欠银行贷款. X为每个月还款金额(本金+利息).月利率S
$$

$$
故: A_1 = AS(1+S)-X
$$

$$
所以: A_2 = A_1(1+S)-X = A(1+S)^{2}-X[(1+S)+1]
$$

$$
递推得到: A_n = A_{n-1}(1+S)-X
$$
$$
展开得: A_n= A(1+S)^n-X[(1+S)^{n-1}+(1+S)^{n-2}+\cdots+(1+S)+1]
$$
$$
利用等比数列求和公式:A_n= A(1+S)^n-\frac{X[1+S]^n-1}{S}
$$

$$
因此: X = \frac{AS(1+S)^{m}}{(1+S)^m-1}
$$

等额本金

等额本金是指一种贷款的还款方式,是在还款期内把贷款数总额等分,每月偿还同等数额的本金和剩余贷款在该月所产生的利息,这样由于每月的还款本金额固定,而利息越来越少,借款人起初还款压力较大,但是随时间的推移每月还款数也越来越少。

每个月偿还本金都是一样的,只是偿还的利息越来越少.
$$
设总贷款金额为A,还款月数为Month,月利率为S.第n月还款数为:A_n
$$
$$
故:
A_n = \frac{A}{Month} + (A - \frac{A}{Month} * n) * S
$$

代码实现

/*
@Time : 2019/9/24 16:48
@Author : louis
@File : paymydebt
@Software: GoLand
*/

package main

import (
    "fmt"
    "math"
)


const (
    bases  float64 = 0.049           //商业贷款基准年利率
    baseS          = bases * 1.1     //上浮10%
    baseG          = 0.032           //公积金贷款基准年利率
    S              = baseS / 12      //商业贷款月利率上浮 10%
    G              = baseG / 12      //公积金贷款月利率
    Start          = 10 - offset     //起始还贷日期如:10月份
    offset         = 1               //偏移量.%12后为0-11.
    Year           = 30              //贷款年份
    Month          = 12*Year + Start //贷款月数12*30
    AG             = 150000          //公积金贷款总额
    AS             = 880000          //商业贷款总额
    //S               = 0.0044916 //商业贷款月利率上浮 10%
)


/*
- 原理:

**每个月偿还本金都是一样的**,只是偿还的利息越来越少.

*/
func benJ() {
    const (
        bs = AS / (Month - Start) //商贷每月偿还本金
        bg = AG / (Month - Start) //公积金每月偿还本金
    )
    var (
        jG               = [Month]float64{} //公积金每月待还
        jS               = [Month]float64{} //商业每月待还
        money            = [Month]float64{} //总待还
        payBackG float64 = 0                //公积金已偿还
        payBacks float64 = 0                //商贷已偿还
        payBack  float64 = 0                //总偿还

    )
    for i := Start; i < Month; i++ {
        jG[i] = bg + (AG-bg*(float64(i-Start)))*G
        payBackG += jG[i]
        jS[i] = bs + (AS-bs*(float64(i-Start)))*S
        payBacks += jS[i]
        money[i] = jG[i] + jS[i]
        payBack = payBacks + payBackG
        //偏移量补足即可
        fmt.Printf("%4d年%2d月还款: %.2f = %.2f[公积金] + %.2f[商贷],已还%.2f\n",
            2019+i/12, i%12+offset, money[i], jG[i], jS[i], payBack)
    }
    fmt.Printf("等额本金共计偿还利息为:%.2f\n", payBack-AS-AG)
}

/*

- 原理:
**每个月总偿还金额是不变的.**
*/
func benX() {
    var es, eg float64
    es = AS * S * math.Pow(1+S, Month) / (math.Pow(1+S, Month) - 1)
    eg = AG * G * math.Pow(1+G, Month) / (math.Pow(1+G, Month) - 1)
    fmt.Printf("%.2f+%.2f = %0.2f\n", eg, es, es+eg)
    fmt.Printf("共计偿还利息为:%.2f", (es+eg)*Month-AG-AS)
}

func main() {
    benJ()
    fmt.Printf("\n等额本息:")
    benX()
}

验证

$ go run main.go
201910月还款: 7212.67 = 816.00[公积金] + 6396.67[商贷],已还7212.67
201911月还款: 7200.58 = 814.89[公积金] + 6385.69[商贷],已还14413.25
201912月还款: 7188.49 = 813.78[公积金] + 6374.71[商贷],已还21601.74
...
2049 8月还款: 2885.53 = 418.86[公积金] + 2466.67[商贷],已还1812626.77
2049 9月还款: 2873.45 = 417.75[公积金] + 2455.70[商贷],已还1815500.21
等额本金共计偿还利息为:785500.21

等额本息:639.29+4887.91 = 5527.20
共计偿还利息为:1009535.42

感谢阅读~~

参考