面接官「0.1 + 0.2 == 0.3 が成立しない理由を説明せよ」
という質問がきたらどう答えるだろうか。
0.3にはならない
Javascript
適当なブラウザから以下のようなJavascript実行した。結果「0.1+0.2==0.3」は「false」となった。
0.1+0.2==0.3
//false
0.1+0.2===0.3
//false
ちなみに以下のような先頭に0をつけなくても、小数点として解釈される。
.1+.2==.3
//false
Python
バージョン3.10.11で検証する。同様に「0.1+0.2==0.3」は「false」となった。
>>> 0.1+0.2==0.3
False
なぜか
これは、計算機が浮動小数点数を2進数で表現する際に、特定の小数は正確に表現できず、誤差が発生するためです。10進数の0.1や0.2は、2進数では無限に続く循環小数となるため、これらの数値を正確に表現することができません。その結果、0.1 + 0.2 は 0.3 と等しくならないことがあります。
小数点以下の数値→2進数へ変換する方法
CSを修めていればご存知方と思いますが、復習します。
- 小数点以下の数値を2倍する
- 結果の整数部分を取り出し、それを2進数の桁として記録する
- 小数部分だけを次のステップに持ち越す
- 小数部分が0になるか、所定の精度に達するまで1〜3を繰り返す
0.1 × 2 = 0.2
整数部分: 0
小数部分: 0.2
0.2 × 2 = 0.4
整数部分: 0
小数部分: 0.4
0.4 × 2 = 0.8
整数部分: 0
小数部分: 0.8
0.8 × 2 = 1.6
整数部分: 1
小数部分: 0.6
(以下省略)
最終的に0.1は0.0001100110011001100110011....
となる。
まとめ
この問題の本質は、コンピュータが浮動小数点数を扱う際の誤差にあります。浮動小数点数の精度と表現方法を理解しておくことが重要です。
(追記)
言語仕様によるよ!
どういった仕様で実装されているか本質的な部分にも関心向ける機会ってあんまりなですよね。