【まるめごさ】

丸め誤差 とは?

💡 0.1 + 0.2 ≠ 0.3、コンピュータの小数は完璧じゃない
📌 このページのポイント
丸め誤差:0.1 + 0.2 ≠ 0.3 の理由 10進数 0.1 = きっちり 0.1 人間にとって正確 2進数 0.1 = 0.00011001100... 無限に続く循環小数! 0.1 + 0.2 = 0.30000000000000004 !? 対策方法 整数で計算する BigDecimalを使う 誤差許容で比較する
丸め誤差のイメージ
ひよこ ひよこ

0.1 + 0.2 が 0.3 にならないって本当なの?

ペンギン先生 ペンギン先生

本当だよ!多くのプログラミング言語で 0.1 + 0.2 を計算すると 0.30000000000000004 みたいな結果になるんだ。これが丸め誤差の典型例だよ。

ひよこ ひよこ

なんでそんなことが起きるの?

ペンギン先生 ペンギン先生

コンピュータは2進数で小数を表すんだけど、10進数の0.1は2進数だと0.0001100110011……と無限に続く循環小数になるんだ。有限のビット数で切り詰めるから、微小な誤差が出てしまうんだよ。

ひよこ ひよこ

それって困る場面があるのかな?

ペンギン先生 ペンギン先生

大アリだよ!お金の計算で1円ズレたら大問題だし、科学計算で何百万回も計算を繰り返すと誤差がどんどん膨らむことがある。湾岸戦争ではパトリオットミサイルの時刻計算の丸め誤差で迎撃に失敗した事例があるんだ。

ひよこ ひよこ

どうやって対策するの?

ペンギン先生 ペンギン先生

金融では小数を使わず「円」を最小単位の整数(銭や厘単位)で計算するか、JavaのBigDecimalのような10進浮動小数点型を使うんだ。あと比較するときは == ではなく「差の絶対値が十分小さいか」で判定するのが鉄則だよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「丸め誤差」って出てきたら「コンピュータの小数計算で生じるズレ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Rounding Error」 = 丸め(四捨五入)による誤差
💬 数値を有限桁に丸める(Round)ときに出る誤差だからこの名前なんだよ
← 用語集にもどる