JavaScript 如何计算复利计息下的累计总缴费金额?
问题根源
你使用的累计缴费公式完全错误,混淆了复利增长的数学计算逻辑。你的场景本质是年复利增长的等比数列求和,直接套用标准等比数列公式即可,无需使用原站点给出的total计算式。
计算逻辑对齐
先和你给出的示例规则匹配时间轴:
a为初始基准缴费额(第0年的缴费额度)- 年增长率
i为百分数转成的小数,每年缴费在上一年基础上增长i - 你现有代码中计算第
d年缴费额的逻辑是正确的:payment = a * (1+i) ** d,代入示例参数得到的50年后约1147美元的结果完全符合预期 - 累计总缴费是第1年到第
d年所有缴费额的总和,对应标准等比数列求和:- 首项为第1年缴费额:
a*(1+i) - 公比为年增长倍数:
(1+i) - 项数为总缴费年数:
d - 求和公式简化后为:
total = a * (1+i) * (((1+i) ** d) - 1) / i
- 首项为第1年缴费额:
数值验证
代入示例参数(a=100,i=5%=0.05,d=50):total = 100 * 1.05 * (1.05**50 - 1) / 0.05 ≈ 21981.54美元
你手动累加得到21985美元的差异,是因为给出的年度明细对每一年缴费额做了取整处理,产生了微小累积误差,属于正常情况。
修正代码
替换原有错误的total计算逻辑即可,修改后的JS函数:
function myFunction() { var a = +document.getElementById('amount').value; var i = +document.getElementById('percentage').value / 100; var d = +document.getElementById('duration').value; var payment = a * ((1 + i) ** d); // 等比数列求和计算累计总缴费 var total = a * (1 + i) * (((1 + i) ** d) - 1) / i; document.getElementById('payment').textContent = payment.toFixed(2); document.getElementById('total').textContent = total.toFixed(2); }
原有HTML结构不需要修改,保持原逻辑即可。
若你的实际缴费规则是从第0年就开始缴费(即第一年缴费就是初始的100美元,之后再逐年增长),将
total公式改为total = a * (((1 + i) ** d) - 1) / i即可,对应计算第0年到第d-1年的缴费总和。
内容的提问来源于stack exchange,提问作者user1800520
相关产品推荐
相关产品推荐

