70
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

面接官「0.1 + 0.2 == 0.3 が成立しない理由を説明せよ」

Last updated at Posted at 2024-05-22

面接官「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

image.png

ちなみに以下のような先頭に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を修めていればご存知方と思いますが、復習します。

  1. 小数点以下の数値を2倍する
  2. 結果の整数部分を取り出し、それを2進数の桁として記録する
  3. 小数部分だけを次のステップに持ち越す
  4. 小数部分が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....となる。

まとめ

この問題の本質は、コンピュータが浮動小数点数を扱う際の誤差にあります。浮動小数点数の精度と表現方法を理解しておくことが重要です。

(追記)
言語仕様によるよ!
どういった仕様で実装されているか本質的な部分にも関心向ける機会ってあんまりなですよね。

70
57
15

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
70
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?