上周我上线了一个按日复利计算器。起初我认为这数学是已经解决的问题:A = P(1 + r/n)^(nt),接上输入框,完事。 事实证明并非如此,而且最有趣的bug根本不在公式里。 教科书公式覆盖的是一笔本金放那儿不动的情形。一旦你加入定期投入——比如每月$100——你就必须决定每笔存款从何时开始计息。 偷懒的做法是让所有投入在期末才统一入账: ```javascript // 错误:投入的资金从未参与复利 const balance = P * Math.pow(1 + r / n, n * t) + monthly * 12 * t; ``` 正确的做法是让每笔存款从到账那天起就开始复利: ```javascript // 每笔投入按各自剩余天数复利 let balance = P * Math.pow(1 + dailyRate, totalDays); for (let day = 1; day <= totalDays; day++) { if (isDepositDay(day)) { balance += monthly * Math.pow(1 + dailyRate, totalDays - day); } } ``` (生产环境里我用的是年金公式的闭式解而不是循环,但循环版本更能直观体现差异所在。) 这个差异值多少钱?用$10,000本金、5%年利率、按日复利、每月追加$100、持续十年: 误差是$3,535.63。我在开发时检查了多个排名靠前的复利计算器,不止一个输出的是那个错误数字。 银行宣称"按360天基准计息",于是我加了一个365/360天数切换开关,以为会看到什么戏剧性差异。 结果呢?名义利率不变,只改指数里的天数基准,$10,000放十年,差异只有1美分。这个开关是诚实的,但把它吹成卖点就是表演。 真正影响资金量的是"银行家算法":年利率除以360,却按365天收取利息。这把有效利率乘以365/360,相当于1.39%的提升,把5%变成约5.07%,$16,486.65变成约$16,601。同样的标签,三个数量级的影响。 如果你在构建金融计算器,最大的坑往往不在公式本身,而在那些"理所当然"的默认假设:每笔投入何时开始计息、一年到底算几天、复利发生在哪一刻。这些沉默的细节,决定用户账户里是多出几块钱,还是少了几千块。
![]()
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.