const 总贷款额 = 100 * 10000; // 100个W
const 总贷款月数 = 30 * 12; // 30年
const 还款日 = 1;
// 首次还款、提前部分还款、LPR 利率调整,这些关键节点将整个还款周期切分为多个阶段
// 每个阶段的起始月,本金或利息会多还一些,没啥规律,需要根据实际还款金额手动重置
// 另外,不同银行对于提前还款的违约金约定不一样,根据合同约定自行另算
// 注意:还款阶段的时间顺序,手动保障,不要错乱
const 还款阶段 = new Map();
// 首次还款,初始化年利率,后续阶段年利率无变化就不需要重复设置
还款阶段.set('2021-02', {
年利率: 5.35,
重置本金: 666.66,
重置月息: 999.99,
});
// 提前还本金,注意需要精确到“日”,还款日期之后的本金减少,利息自然也会相应减少,需要分开计算
还款阶段.set('2021-07-20', {
提前还款: 10 * 10000,
});
// 提前还本金,同时缩短贷款年限
还款阶段.set('2022-07', {
提前还款: 10 * 10000,
总贷款月数缩短: 10 * 12, // 原先是 30 年,缩短至 20 年,这里就减掉 10 年
});
// LPR 利率调整,更新贷款年利率
还款阶段.set('2023-02', {
年利率: 5,
});
// 可在任意阶段设置断点,可以打印出来 已还 和 待还 信息
还款阶段.set('2024-02', {
断点: true,
});
// 入参
// 1、“还款阶段”在配置时是 Map,这里需要转成 Array:[...还款阶段.entries()]
// 2、silence 为 true 时,配置的“断点”就不会打印信息
function calculate(贷款额, 贷款月数, 还款阶段, { silence = false } = {})
// 出参
{
累计月供,
累计本金,
累计利息,
table,
}