房贷计算器
等额本息
期数 | 每月还款 | 当月还的本金 | 累计还的本金 | 还欠的本金 | 当月还的利息 | 累计还的利息 | 累计还的利息 + 累计还的本金 |
---|---|---|---|---|---|---|---|
{{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);
总结
其实这里面还有很多问题,可以深究。
2022 – 02,5.64
2023 – 02,5.29