ちいつる
A-12リファレンス

複利・金利計算の実装パターン

ローン・積立・為替計算の数式と、実務で踏みがちな誤差の落とし穴を示す。

触ってみる積立額・年利・年数を動かしてみてください
毎月の積立額
3.0万円
想定年利
5%
積立年数
20年

元本 7,200,000円(点線)に対し、評価額は 12,331,010(実線)。差の5,131,010円が複利の運用益。

序盤は点線と実線がほとんど重なっている。差が開き始めるのは後半で、しかもいったん開くと一気に加速する。積立を早く始めた方がいいと言われるのは、この後半の伸びを何年ぶんも余計に受け取れるからだ。

単利・複利の数式

単利は元本にのみ利息がつく(元本×利率×年数)。複利は前年までの利息にも次の利息がつくため、元本×(1+利率)^年数という指数関数になる。年数が長いほど複利の効果は加速し、この差が「積立をなるべく早く始めるべき」という助言の数学的な根拠になっている。

触ってみる元本・年利・年数を動かして2本の線を比べてください
元本(一括)
100万円
年利
5%
年数
20年

単利(点線)

200万円

複利(実線)

265万円

20年後の差は65万円。利率×年数が同じでも、利息が利息を生む複利は指数関数として離れていきます。

点線の単利はまっすぐ伸びるだけ。実線の複利は、利息がまた利息を生むぶんだけ上へ反っていく。同じ利率でも、この「利息にも利息」というひと手間があるかどうかで、最終額は指数的に離れていく。

触ってみる年利スライダーを動かして倍加年数の近似と厳密解を比べてください
年利
6%
72 ÷ 6(暗算の近似)12.0
ln2 ÷ ln(1+r)(厳密解)11.9

近似の誤差は+0.10年(+0.9%)。年利8%前後で最も一致し、極端に高い/低い利率ほどズレます。「資産が2倍になる年数」を暗算する定番テクニックの中身です。

「72÷利率」で資産が2倍になる年数がざっと出るのは、複利の式を対数で解いた ln2÷ln(1+利率) の良い近似だから。年利8%前後で最もよく一致する。

ローン返済(元利均等・元金均等)の計算ロジック

元利均等返済は毎月の返済額が一定になる方式で、返済初期は利息の割合が高く、後半になるほど元金の割合が増える。元金均等返済は毎月の元金部分を一定にするため、返済額は初期が高く徐々に減っていく。総支払額は元金均等の方が少なくなるが、初期の負担は元利均等より重い。

触ってみる借入額・年利・期間を動かして2本の線を比べてください
借入額
3,000万円
年利
1.5%
返済期間
30年

元利均等(実線)

毎月 10.4万円 で一定 / 総支払 3,727万円

元金均等(点線)

初月 12.1万円 から漸減 / 総支払 3,677万円

総支払額の差:50万円(元金均等の方が少ないが、初期の毎月負担は重い)

水平な実線が元利均等、右肩下がりの点線が元金均等。金利や期間を上げるほど、2方式の総支払額の差は広がっていく。毎月を平らにするか、総額を抑えるか。どちらを取るかで、最終的に払う金額そのものが変わる。

触ってみる借入額・年利・期間を動かして毎月返済額の内訳の変化を見てください
借入額
3,000万円
年利
1.5%
返済期間
30年
利息(初期ほど大きい)元金(後半ほど大きい)

毎月返済額は10.4万円で一定なのに、内訳は序盤ほど利息の割合が高い。総利息は727万円

毎月の返済額は一定なのに、その内訳は序盤ほど利息が厚い。繰り上げ返済が早いほど効くのはこのためで、減らせる元金がまだ多く残っているうちなら、後々の利息をまとめて削り落とせる。

為替・手数料を含む実務計算の注意点

為替を絡めた計算では「両替時の手数料(スプレッド)」を見落としやすい。表示レートそのままで計算すると、実際の受取額と数円〜数%のズレが生じる。積立計算でも、信託報酬のような継続コストを年率から差し引かずに試算すると、将来の資産額を過大に見積もることになる。

触ってみる金額とスプレッドを動かして往復両替の目減りを見てください
両替する額(円)
10万円
片道スプレッド
1.00%
手元に戻る目減り

円→ドル

$660.07

ドル→円

98,020

目減り

1,980

仲値150円/ドルは往復で変わらないのに、往復で1.98%目減りします(片道1.00%×2が効く)。表示レートのまま計算すると、この手数料を見落とします。

仲値は往復で変わらないのに、片道ごとにスプレッド分だけ不利なレートが適用されるため、円→ドル→円で戻すと必ず目減りする。表示レートのまま計算すると、この手数料がまるごと抜け落ちる。

触ってみる年率コストを動かして、コスト有無の資産曲線の差を見てください
元本(一括)
500万円
表面利回り
5%
年率コスト(信託報酬)
1.00%
年数
30年

コスト無視(点線)

2,161万円

コスト控除後(実線)

1,603万円

1.00%のコストは、30年で558万円もの差になります。年率から引かずに試算すると、将来額をこれだけ過大評価します。

年1%のコストは一見わずかだが、複利で回る年数が長いほど差は広がり続ける。運用益に毎年かかり続ける目減りは、時間を味方につけるほど逆に重くのしかかってくる。コストを引かずに試算すれば、将来額はそのぶん過大に見える。

浮動小数点誤差への対処

JavaScriptの数値は浮動小数点であるため、0.1 + 0.2 !== 0.3のような誤差が生じる。金額計算では最小単位(円やセント)の整数で計算してから最後に小数点に戻す、または誤差許容範囲を持たせた比較・丸め処理を必ず入れる必要がある。

触ってみる加算する額と回数を変えて、誤差の育ち方を見てください
加算する額
加算する回数
3回

float のまま 0.13 回加算

0.30000000000000004

整数化(×10)して加算 → 最後に割り戻す

0.3

誤差は5.551e-17。1回では見えない誤差も、加算を重ねるほど蓄積します。金額計算で整数化が必須になる理由です。

0.1を3回足すだけで、もう答えは0.3ちょうどにならない。積立や返済のような「同じ計算の繰り返し」でこの誤差が蓄積するからこそ、金額は整数の最小単位で計算する。

触ってみる件数のスライダーを大きくして、丸め方式ごとにズレがどう積み上がるか見てください
利息計算の件数
500件
丸め単位
切り捨て
-249
四捨五入
-8
切り上げ
+251

正しい合計(丸めなし):1,298,159

切り捨ては1件あたり平均 -0.50ぶん下振れ。件数が増えるほど、この小さなズレが積み上がります。

1件だけなら端数の丸めは誤差の範囲。ところが件数を増やすと、切り捨ては毎回わずかに下振れするぶんが片側にたまり続け、バーが伸びていく。四捨五入はプラスとマイナスがほぼ相殺してゼロ付近をふらつくだけ。同じ利息でも、どの丸めを選ぶかで合計が体系的にズレる。だから丸め方式は実装任せにせず、仕様で固定しておく。

触ってみる分割数のスライダーを1回から増やして、曲線がどこで頭打ちになるか探してください
年利
6%
年数
20年
1年の分割数(複利の頻度)
12回/年
よく使う頻度

元本100万円・年利6%・20年。いま12回/年で最終額331万円、連続複利の天井まであと9,912円(91.2%到達)。分割を上げてもertの破線は超えられません。

分割数を上げていくと、最終額は最初こそぐんと伸びるのに、毎月あたりでもう破線の天井にほぼ貼りつく。年1回と毎日の間ですら差はごくわずかで、いくら細かく回しても連続複利 e^(rt) を超えることはない。「複利」を実装するとき、どの間隔で回すかは決めておくべきパラメータだが、頻度を上げれば上げるほど得をするわけではない、というのがこの頭打ちの意味。

次はこれ