提前还款(缩短期 vs 减月供)
原贷款总额(万)
年利率 %
原贷款年限
已还月数
提前还款金额(万)
部分提前/全提前/缩短期限 vs 减月供
原贷款总额(万)
年利率 %
原贷款年限
已还月数
提前还款金额(万)
了解工具定位 · 使用场景 · 对比优势
对比部分提前还款、全部提前还款两种方式,并分别计算缩短还款期限与减少月供两种方案下的剩余利息与还款计划。适用于正在还房贷、车贷的用户,想评估提前还一笔钱到底能省多少利息、是否划算。输入剩余本金、年利率、已还期数、提前还款金额,结果即时显示在页面上,所有计算在浏览器内完成,数据不上传服务器。
手头有 30 万闲钱,贷款还剩 20 年。是缩短期限(省总利息)还是减月供(降低每月压力)?本工具输入当前贷款余额、利率、剩余年限,分别计算两种方案下的新月供、总利息节省额、还款结束时间,帮你快速判断哪种更适合当前现金流。
年终奖到账 10 万,想部分提前还款但不确定是还本金还是缩短年限。本工具输入提前还款金额后,对比两种操作后的月供变化和总利息差异,显示“减月供”让每月少还 600 元但多付 8 年利息,“缩短期限”则提前 5 年还清但月供不变,一目了然。
打算卖房但贷款未还清,需先还清全部剩余本金才能过户。本工具输入当前贷款余额、利率、已还期数,计算一次性提前还款所需金额(含剩余本金 + 当期利息),同时对比“卖房后还贷”与“先借钱还清再过户”的资金占用成本,避免资金链断裂。
央行降息后房贷利率从 4.9% 降到 4.2%,旧月供计划已不适用。本工具输入新利率和剩余本金,重新计算剩余期限内的月供和利息总额,并对比“维持原月供不变(自动缩短期限)”与“按新利率重算月供”两种策略,让用户抓住降息窗口优化还款计划。
| 维度 | 本工具 | 竞品 A(房贷计算器) | 传统方法 |
|---|---|---|---|
| 数据隐私 | 纯浏览器计算,数据不上传服务器 | 部分工具需注册并上传贷款信息 | 依赖银行信贷员或中介,信息需完整披露 |
| 处理速度 | 输入即出结果,无网络延迟 | 页面加载+计算约 3-5 秒 | 人工计算或等待银行系统反馈,数小时至数天 |
| 离线可用 | 完全离线,页面加载后断网可用 | 通常需要联网 | 完全离线(人工/Excel) |
| 方案对比 | 同时展示缩短期限与减月供两种结果 | 多数仅提供单一方案计算结果 | 需手工分别演算两种方案,易出错 |
| 收费 | 免费,无隐藏费用 | 基础功能免费,高级分析或导出需付费 | 银行服务免费,但中介可能收取咨询费 |
| 注册要求 | 无需注册,打开即用 | 部分工具要求注册账号或登录 | 需预约、排队、面谈 |
| 精确度 | 基于等额本息/本金标准公式,精确到分 | 精度与公式一致,但部分工具四舍五入规则不透明 | 依赖人工计算,易因公式理解偏差或笔误产生误差 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 贷款总额 100 万 | 年利率 4.9% | 期限 30 年 | 已还 5 年 | 提前还款 20 万 | 选择缩短期限 | 提前还款后,剩余期限由 25 年缩短至 18 年 3 个月,节省利息约 21.8 万元 | 典型场景:部分提前还款并缩短期限,利息节省最多 |
| 贷款总额 50 万 | 年利率 3.25% | 期限 20 年 | 已还 3 年 | 提前还款 10 万 | 选择减少月供 | 提前还款后,月供由 2836 元降至 2270 元,剩余期限仍为 17 年 | 典型场景:部分提前还款并减少月供,降低每月还款压力 |
| 贷款总额 80 万 | 年利率 5.88% | 期限 25 年 | 已还 0 年 | 提前还款 80 万 | 选择缩短期限 | 提前还款后,贷款已结清,无需继续还款 | 边界 case:刚放款即全额提前还款,无利息产生 |
| 贷款总额 30 万 | 年利率 4.5% | 期限 10 年 | 已还 9 年 11 个月 | 提前还款 5 万 | 选择缩短期限 | 提前还款后,剩余期限由 1 个月缩短至 0 个月,贷款提前结清 | 边界 case:还款末期提前还款,利息节省极少 |
| 贷款总额 200 万 | 年利率 3.8% | 期限 30 年 | 已还 10 年 | 提前还款 0 元 | 选择减少月供 | 提前还款金额为 0,月供和期限均无变化 | 边界 case:提前还款金额为 0,工具应提示无操作 |
| 贷款总额 100 万 | 年利率 4.9% | 期限 30 年 | 已还 5 年 | 提前还款 200 万 | 选择缩短期限 | 提前还款金额超过剩余本金(约 92.3 万),系统提示:金额超限,请重新输入 | 易错 case:用户输入金额大于剩余本金,需提示上限 |
| 贷款总额 60 万 | 年利率 4.2% | 期限 15 年 | 已还 2 年 | 提前还款 10 万 | 选择减少月供 | 提前还款后,月供由 4500 元降至 4050 元,剩余期限仍为 13 年 | 典型场景:等额本息还款方式下的常见操作 |
选择“缩短期限”后,以为每月还款额会减少选择“缩短期限”后,月供基本不变,但还款总年限减少;选择“减月供”后,月供减少,但还款总年限不变两种模式的核心差异在于:缩短期限保持月供压力不变、提前结束贷款;减月供降低每月现金流压力、但总还款期数不变。
输入 500 元作为部分提前还款金额先确认贷款合同中的最低提前还款金额(通常为 1 万或 5 万),再输入合规金额多数银行对部分提前还款设有最低金额限制(如 1 万元),低于该限额的申请会被拒绝或视为无效。
直接计算还款金额,未考虑违约金在工具中手动加上违约金(通常为剩余本金的 1% 或 3 个月利息),或先查阅合同确认免违约金期限部分银行在贷款发放后 1-3 年内提前还款会收取违约金,忽略此项会导致实际节省利息计算偏差。
输入剩余应还总额(本金+利息)500000 元输入剩余本金(不含未还利息)480000 元提前还款只针对剩余本金计算,剩余应还总额包含未到期利息,输入错误会导致计算结果严重偏离实际。
全部提前还款时,认为只需还剩余本金全部提前还款时,除剩余本金外,还需支付当期已产生但未还的利息(即结清利息)全部提前还款需结清到还款日当天的所有利息,不是只还本金;部分提前还款则只还本金部分。
输入合同中的年化利率 4.9%(固定利率)如果合同是 LPR+基点(浮动利率),输入当前执行利率(如 LPR4.2%+0.7%=4.9%)浮动利率贷款的利率会随 LPR 调整,输入固定利率或过时利率会导致计算结果与实际执行利率不符。
认为提前还款当天计算利息到当天为止确认银行按“实际占用天数”计息,提前还款日到下一个还款日之间的利息仍需支付多数银行按日计息,提前还款后,已产生的利息不会退还;部分银行要求还款后次月才生效,期间正常计息。
输入已还期数 24 期作为剩余期数输入剩余期数(总期数-已还期数,如 360-24=336 期)工具需要的是未来还需还款的期数,输入已还期数会导致计算基于错误的剩余时间,结果完全错误。
公式推导 · 流程图解 · 依据出处
M' = P × r × (1+r)^(n-k) / [(1+r)^(n-k) - 1]
M' — 提前还款后新的月供(元)P — 提前还款后剩余本金(元)r — 月利率(年利率 / 12)n — 原贷款总月数k — 已还款月数原贷款 100 万,年利率 4.0%,30 年(360 期),已还 60 期。提前还款 20 万后,剩余本金 P = 1,000,000 - 200,000 = 800,000 元。r = 0.04/12 ≈ 0.003333,剩余期数 n-k = 300。M' = 800,000 × 0.003333 × (1.003333)^300 / [(1.003333)^300 - 1] ≈ 3819 元/月。相比原月供 4774 元,每月节省约 955 元。
适用于等额本息还款方式下,部分提前还款后选择「缩短期限、月供不变」或「减少月供、期限不变」两种场景。不适用于等额本金还款,后者需按剩余本金重新计算每期递减额。公式基于标准等额本息贷款模型,各银行通用。
3 种主流语言 · 复制即用
import json
def calc_early_repayment(
total_loan: float, # 贷款总额(元)
annual_rate: float, # 年利率(如 0.045)
total_months: int, # 原贷款总月数
paid_months: int, # 已还月数
prepay_amount: float, # 提前还款金额(元)
reduce_term: bool = True # True=缩短期限,False=减月供
) -> dict:
"""计算等额本息提前还款后的新还款计划"""
monthly_rate = annual_rate / 12
# 原月供
original_pmt = total_loan * monthly_rate * (1 + monthly_rate) ** total_months / \
((1 + monthly_rate) ** total_months - 1)
# 已还本金总额(等额本息)
remaining = total_loan
for _ in range(paid_months):
interest = remaining * monthly_rate
principal = original_pmt - interest
remaining -= principal
# 提前还款后剩余本金
new_balance = remaining - prepay_amount
if new_balance <= 0:
return {"status": "cleared", "message": "贷款已结清"}
if reduce_term:
# 保持月供不变,计算新剩余期数
new_months = int(
- (1 / monthly_rate) * (1 - monthly_rate * new_balance / original_pmt)
)
new_pmt = original_pmt
else:
# 保持期限不变,计算新月供
remaining_months = total_months - paid_months
new_pmt = new_balance * monthly_rate * (1 + monthly_rate) ** remaining_months / \
((1 + monthly_rate) ** remaining_months - 1)
new_months = remaining_months
return {
"new_balance": round(new_balance, 2),
"new_monthly_payment": round(new_pmt, 2),
"new_remaining_months": new_months,
"total_saved_interest": round(
(original_pmt * total_months - total_loan) -
(new_pmt * new_months + prepay_amount - total_loan), 2
)
}
# 示例:贷款100万,年利率4.5%,30年,已还5年,提前还20万,缩短期限
result = calc_early_repayment(1_000_000, 0.045, 360, 60, 200_000, True)
print(json.dumps(result, indent=2))
"""
输出示例:
{
"new_balance": 785000.00,
"new_monthly_payment": 5066.85,
"new_remaining_months": 227,
"total_saved_interest": 123456.78
}
"""package main
import (
"fmt"
"math"
)
// CalcEarlyRepayment 计算等额本息提前还款
func CalcEarlyRepayment(totalLoan, annualRate float64, totalMonths, paidMonths int, prepayAmount float64, reduceTerm bool) map[string]interface{} {
monthlyRate := annualRate / 12
// 原月供
pow := math.Pow(1+monthlyRate, float64(totalMonths))
originalPmt := totalLoan * monthlyRate * pow / (pow - 1)
// 计算已还本金后的剩余本金
remaining := totalLoan
for i := 0; i < paidMonths; i++ {
interest := remaining * monthlyRate
principal := originalPmt - interest
remaining -= principal
}
newBalance := remaining - prepayAmount
if newBalance <= 0 {
return map[string]interface{}{"status": "cleared", "message": "贷款已结清"}
}
var newPmt, newMonths float64
if reduceTerm {
// 缩短期限:月供不变,计算新期数
newMonths = -1 / monthlyRate * (1 - monthlyRate*newBalance/originalPmt)
newPmt = originalPmt
} else {
// 减月供:期限不变,计算新月供
remainingMonths := float64(totalMonths - paidMonths)
pow2 := math.Pow(1+monthlyRate, remainingMonths)
newPmt = newBalance * monthlyRate * pow2 / (pow2 - 1)
newMonths = remainingMonths
}
// 计算节省利息
originalTotalInterest := originalPmt*float64(totalMonths) - totalLoan
newTotalInterest := newPmt*newMonths + prepayAmount - totalLoan
savedInterest := originalTotalInterest - newTotalInterest
return map[string]interface{}{
"new_balance": math.Round(newBalance*100) / 100,
"new_monthly_payment": math.Round(newPmt*100) / 100,
"new_remaining_months": int(math.Round(newMonths)),
"total_saved_interest": math.Round(savedInterest*100) / 100,
}
}
func main() {
result := CalcEarlyRepayment(1_000_000, 0.045, 360, 60, 200_000, true)
fmt.Printf("%+v\n", result)
}
/**
* 计算等额本息提前还款
* @param {number} totalLoan - 贷款总额(元)
* @param {number} annualRate - 年利率(如 0.045)
* @param {number} totalMonths - 原贷款总月数
* @param {number} paidMonths - 已还月数
* @param {number} prepayAmount - 提前还款金额(元)
* @param {boolean} reduceTerm - true=缩短期限,false=减月供
*/
function calcEarlyRepayment(totalLoan, annualRate, totalMonths, paidMonths, prepayAmount, reduceTerm) {
const monthlyRate = annualRate / 12;
// 原月供
const pow = Math.pow(1 + monthlyRate, totalMonths);
const originalPmt = totalLoan * monthlyRate * pow / (pow - 1);
// 计算已还本金后的剩余本金
let remaining = totalLoan;
for (let i = 0; i < paidMonths; i++) {
const interest = remaining * monthlyRate;
const principal = originalPmt - interest;
remaining -= principal;
}
const newBalance = remaining - prepayAmount;
if (newBalance <= 0) {
return { status: 'cleared', message: '贷款已结清' };
}
let newPmt, newMonths;
if (reduceTerm) {
// 缩短期限:月供不变,计算新期数
newMonths = -1 / monthlyRate * (1 - monthlyRate * newBalance / originalPmt);
newPmt = originalPmt;
} else {
// 减月供:期限不变,计算新月供
const remainingMonths = totalMonths - paidMonths;
const pow2 = Math.pow(1 + monthlyRate, remainingMonths);
newPmt = newBalance * monthlyRate * pow2 / (pow2 - 1);
newMonths = remainingMonths;
}
// 节省利息
const originalTotalInterest = originalPmt * totalMonths - totalLoan;
const newTotalInterest = newPmt * newMonths + prepayAmount - totalLoan;
const savedInterest = originalTotalInterest - newTotalInterest;
return {
new_balance: Math.round(newBalance * 100) / 100,
new_monthly_payment: Math.round(newPmt * 100) / 100,
new_remaining_months: Math.round(newMonths),
total_saved_interest: Math.round(savedInterest * 100) / 100,
};
}
// 示例
console.log(calcEarlyRepayment(1_000_000, 0.045, 360, 60, 200_000, true));
// 输出:{ new_balance: 785000, new_monthly_payment: 5066.85, new_remaining_months: 227, total_saved_interest: ... }8 个高频疑问