一份车贷方案写着“24 期零利息”,并不意味着分期买车的总支出一定和全款一样。
有些报价把差价放在别处:全款可以享受现金优惠,分期不能享受;或者分期方案需要额外支付手续费、购买指定保险。月供里没有利息,这些支出仍会影响购车成本。
做对比工具时,第一步不是计算年化,而是把两种购车方式的价格和费用放到同一口径下。零息车贷对比工具 用的就是这种比较方式。
先把两套方案的支出列清楚
设:
- 车辆报价为
price - 全款专享现金优惠为
cashDiscount - 分期手续费为
serviceFee - 分期方案额外保险等差价为
insuranceDiff
在其他费用相同、可以相互抵消的假设下:
[
全款支出 = price - cashDiscount
]
[
分期支出 = price + serviceFee + insuranceDiff
]
两者差额为:
[
差额 = 分期支出 - 全款支出
]
展开后可以看得更清楚:
[
差额 = cashDiscount + serviceFee + insuranceDiff
]
代码如下:
function compareCosts(input: {
price: number;
cashDiscount: number;
serviceFee: number;
insuranceDiff: number;
}) {
const cashCost = input.price - input.cashDiscount;
const financeCost =
input.price + input.serviceFee + input.insuranceDiff;
return {
cashCost,
financeCost,
difference: financeCost - cashCost,
};
}
这里的“保险差价”指分期相对于全款多出来的部分,不是整份保险费用。如果两种方案都要支付相同保险费,把整笔保险费用只加到分期方案,会高估差异。
用一组报价算一遍
假设车辆报价 20 万元:
| 项目 | 全款方案 | 零息分期方案 |
|---|---|---|
| 车辆报价 | 200,000 元 | 200,000 元 |
| 全款专享优惠 | 减 10,000 元 | 无 |
| 分期手续费 | 无 | 6,000 元 |
| 保险等额外差价 | 无 | 2,000 元 |
| 按上述口径的总支出 | 190,000 元 | 208,000 元 |
零息分期方案比全款方案多支出:
[
10000 + 6000 + 2000 = 18000\text{ 元}
]
这 18,000 元里,10,000 元是放弃的全款优惠,另外 8,000 元是分期方案的额外费用。它们的性质不同,但都会影响两种方案的总价比较。
如果销售提供的优惠和费用已经体现在最终报价里,计算时就不能再重复加减。
零息月供怎样计算
假设首付比例为 30%,期数为 24 期,不考虑尾款:
[
首付 = 200000 \times 30\% = 60000\text{ 元}
]
[
贷款本金 = 200000 - 60000 = 140000\text{ 元}
]
本金平均分到 24 期:
[
月供 = 140000 / 24 \approx 5833.33\text{ 元}
]
function zeroInterestPayment(
price: number,
downRatio: number,
months: number,
) {
const down = price * downRatio;
const loan = price - down;
return {
down,
loan,
payment: loan / months,
};
}
其中 downRatio 使用小数,30% 应传入 0.3。
这里的 5833.33 元是理论月供的显示值。若每期实际都按分扣款,最后一期可能需要处理舍入尾差;比较时应使用合同或实际还款计划中的每期金额。
费用折算年化:先说明现金流口径
如果手续费和额外保险差价在放款时支付,可以把它们从贷款本金对应的可用资金中扣除,再按未来每期还款求内部收益率:
const received = loan - serviceFee - insuranceDiff;
const payments = Array.from(
{
length: months },
() => loan / months,
);
const annualRate = annualIrr(received, payments);
对上述例子,按“贷款本金 14 万元,放款时支付 8000 元费用,之后 24 期等额偿还本金”的假设,费用折算年化约为 5.87%。
需要特别区分两个数字:
- 18,000 元:零息分期相对全款的总支出差额,包含放弃的 10,000 元全款优惠。
- 约 5.87%:工具按 6,000 元手续费和 2,000 元保险差价折算的年化;这个结果没有把放弃的全款优惠放入 IRR 的初始现金流。
因此,不能说工具显示的 5.87% 已经覆盖了全部 18,000 元差价。如果希望把放弃的全款优惠也作为期初融资机会成本纳入年化,应另建一套现金流并明确标注假设,不能把它和实际收取的手续费混为一谈。
费用的发生时间也会改变结果。保险差价如果在一年后支付,就应放在对应日期,而不是一律从第 0 期扣除。还款日期不规则时,需要按实际日期计算 XIRR。
为什么总支出更高,也不能只凭一个数字决定
在示例中,分期比全款多付 18,000 元,但买车时需要立即支付的资金不同:全款约需 19 万元;分期首付为 6 万元,额外费用另计。
分期为用户保留了一部分现金,同时带来后续还款义务。比较时可以分别回答两个问题:
- 两套方案的名义总支出差多少?
- 为了保留资金和分期还款,承担的成本是否可以接受?
这也是为什么工具应同时显示总支出差额和月供,而不是只给出一个“划算”或“不划算”的结论。
实现时值得锁住的边界条件
import assert from "node:assert/strict";
import test from "node:test";
test("总支出差额包含放弃的优惠与额外费用", () => {
const result = compareCosts({
price: 200_000,
cashDiscount: 10_000,
serviceFee: 6_000,
insuranceDiff: 2_000,
});
assert.equal(result.cashCost, 190_000);
assert.equal(result.financeCost, 208_000);
assert.equal(result.difference, 18_000);
});
test("无优惠和额外费用时,两方案总支出相同", () => {
const result = compareCosts({
price: 200_000,
cashDiscount: 0,
serviceFee: 0,
insuranceDiff: 0,
});
assert.equal(result.difference, 0);
});
test("零息月供按贷款本金和期数计算", () => {
const result = zeroInterestPayment(200_000, 0.3, 24);
assert.equal(result.loan, 140_000);
assert.ok(Math.abs(result.payment - 5833.33) < 0.01);
});
实际产品还应校验期数必须为正整数、首付比例位于合理范围内、费用不能为负,以及 IRR 的期初可用资金必须大于 0。如果合同包含尾款、提前结清费用或不同日期的附加费用,应把它们放进对应时点的现金流,不能继续使用简单的“贷款本金除以期数”。
零息车贷的“零息”描述的是贷款利息。把全款优惠、分期费用和保险差价分别列清,才能知道两种购车方式究竟相差多少钱。