等额本息的求解之路

房贷计算器

等额本息

年利率:
贷款金额(万元):
贷款期数:
期数 每月还款 当月还的本金 累计还的本金 还欠的本金 当月还的利息 累计还的利息 累计还的利息 + 累计还的本金
{{n}} {{perMonthMoney}} {{c1.get(n)}} {{c2.get(n)}} {{c5.get(n)}} {{c4.get(n)}} {{c3.get(n)}} {{c6.get(n)}}

等额本息的意思是,本金加利息是等额的,所以每个月的还款额是一样的。等额本金说的是每个月还的本金是一样的,所以随着本金越还越少,则相应的利息部分越来越少。

假设我们借了 12 万块,等额本息,分 12 个月还,那么我们可以列出这样的等式,来理解计算过程,帮助我们求出每个月的还款额。其中 p 表示月利率,月利率等于年利率除以 12 个月,A 是我们要求的每月还款额。在这个例子中,我们假设年利率为百分之 6.

a0 = 12;# 这表示我们借了 12 万的本金

a1 = a0 * (1 + p) - A; # 第一个月的利息加本金,减去还款额 A,表示还款了一个月后,未还的钱

a2 = a1 * (1 + p) - A; # 以此类推

an = an-1 * (1 + p) - A; # 当第 12 月的时候,全部还完,当 n =12 时,则这个等式的左右 2 边都为 0。

怎么根据这些例子来求出 A 值呢,我先编程实现了这样一段代码。

 let AnnualInterestRate = 6 / 100;
 let monthlyInterestRate = AnnualInterestRate / 12;
 let summaryRate = 1 + monthlyInterestRate;

 let loanAmount = 12 * 10000;

 let numberOfPeriods = 12;

 function fn(i) {
    if (i === 0) return loanAmount;

    return "(" + fn(i - 1) + " * " + summaryRate + " - x)";
 }

 let v = fn(numberOfPeriods);
 console.log(v + " = 0");

可以拿到公式是:

((((((((((((120000 * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) = 0

完美,我们来解决这个方程里的 x 值就好了。

难道我们真的要解开这个一元十二次方程吗?想了想还是有点难,去网上找了一个工具:https://www.wolframalpha.com/

算出的结果是 10328 元。这就是借款 12 万,等额本息,分 12 期还,每期要还的钱。

假设分 30 年来还,也就是 360 期,那么等式就是这样的:

((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((120000 * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) * 1.005 - x) = 0

要解出这个方程,感觉有点难度。必须得换一个思路来解决问题。

我们把上面的式子展开。1 + p 用大写字母 M 来替代。

a0 = 12

a1 = a0M - A = 12M - A

a2 = a1M - A = (12M - A)M - A = 12M2 - MA - A

a3 = a2M - A = (12M2 - MA - A)M - A = 12M3 - M2A - MA - A

我们可以看到,这里有一个规律,里面有一个等比数列在,在第 n 个月,式子可以这样写:

an = an-1M - A = 12Mn - Mn-1A - Mn-2A - ··· - MA - A

当 a12 = 0 时,代入等比公式,就能求出 A 了。

等比公式求和如下:

$a1 (1 - q^n) \over (1 - q)$

等比公式求和

证明过程可以看这里

这样一来,我们可以写出如下的代码,求出每月还款额(A)了。

let c = loanAmount * summaryRate ** numberOfPeriods;
let a = 1 - summaryRate ** numberOfPeriods;
let b = ((1 - summaryRate) * c) / a;

console.log("每期的还款额:", b);
console.log("总还款额:", b * numberOfPeriods, "总利息:", b * numberOfPeriods - loanAmount);

总结

其实这里面还有很多问题,可以深究。

作者: 曾小乱

喜欢写点有意思的东西

发表回复

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据