如何用JavaScript计算复利?结果不符问题求助
复利计算结果差异原因分析与修正方案
问题根源:月利率计算方式错误
你的预期结果57,794,052.26是基于有效年利率转换的月复利利率计算的,但代码大概率用了名义年利率直接除以12得到的月利率,两者的差异导致结果偏差:
- 你提到的"年利率12%(月利率0.95%)"是近似值,准确的有效月利率应为:
(1 + 0.12) ** (1/12) - 1 ≈ 0.00948879(约0.9489%) - 若直接用
0.12 / 12 = 0.01(1%)作为月利率,计算出的结果就是你实际得到的59,001,801.91,这是名义月利率的计算结果。
两种计算方式的结果验证
1. 名义月利率1%(当前代码逻辑)
公式:
终值 = 本金 * (1 + 月利率)^期数 + 月缴额 * [(1 + 月利率)^期数 - 1] / 月利率
代入数值:
- 本金部分:
10000000 * (1.01)^60 ≈ 18166966.98 - 年金部分:
500000 * [(1.01)^60 - 1]/0.01 ≈ 40834834.9 - 总和:
18166966.98 + 40834834.9 ≈ 59001801.88(与你的实际结果一致)
2. 有效月利率≈0.948879%(匹配预期结果)
用同一公式代入准确的有效月利率:
- 本金部分:
10000000 * (1.00948879)^60 ≈ 17623416.83 - 年金部分:
500000 * [(1.00948879)^60 - 1]/0.00948879 ≈ 40170635.43 - 总和:
17623416.83 + 40170635.43 ≈ 57794052.26(与你的预期结果完全匹配)
修正后的JavaScript代码
// 参数定义 const principal = 10000000; // 本金 const monthlyPayment = 500000; // 月缴额 const annualRate = 0.12; // 年利率12% const years = 5; // 期限5年 const months = years * 12; // 总期数60个月 // 计算有效月利率(关键修正点) const monthlyRate = Math.pow(1 + annualRate, 1/12) - 1; // 计算终值:本金复利终值 + 期末缴费年金终值 const compoundedPrincipal = principal * Math.pow(1 + monthlyRate, months); const annuityFutureValue = monthlyPayment * (Math.pow(1 + monthlyRate, months) - 1) / monthlyRate; const totalFutureValue = compoundedPrincipal + annuityFutureValue; // 输出保留两位小数的结果 console.log(totalFutureValue.toFixed(2)); // 输出:57794052.26
额外说明
如果你的缴费是期初缴费(每月初存入),则年金终值需要乘以(1 + monthlyRate),修正后的年金部分公式为:
const annuityFutureValue = monthlyPayment * (Math.pow(1 + monthlyRate, months) - 1) / monthlyRate * (1 + monthlyRate);
你的预期结果对应期末缴费场景,无需调整此部分。
内容的提问来源于stack exchange,提问作者user19345389
相关产品推荐
相关产品推荐

