西海岸より

つらつらざつざつと

エクセルでの演算誤差(1.2-1.1は0.1にならない)

小数点の計算をやるからといってすぐにfloatやdoubleを使ってはいけない - じゅんいち☆かとうの技術日誌
を見て思い出したのけれど、大学のソフトウェアの講義で最初に習ったのが、エクセルでは誤差が出るよというお話。
実際にやってみるとわかりやすい。

  • エクセルを普通に開いて、「=1.2-1.1」という式を入力してEnterを押す


  • もちろん結果は「0.1」


  • とここで、「0.1」と表示されたセルを右クリックで、「セルの書式設定」を選択


  • 「表示形式」タブで、「数値」を選択し、小数点以下の桁数を増やしていくと、16桁で数値が変化!


  • この状態で「OK」を押すと、結果は「0.09999999999999990」に

なぜ??

これはエクセル内部で2進数で値を扱っているためであり、10進数の小数を2進数に変換する場合、循環小数となってしまい近似されてしまう。

      1.2 (2進変換)=> 1.001100110011001100110011001100110011
    - 1.1 (2進変換)=> 1.000110011001100110011001100110011010
1.2 - 1.1 (2進変換)=> 0.000110011001100110011001100110011001 =>
                             (10進変換)=> 0.0999999999999999

(2進変換の計算は、基数変換(10進数を2進数,8進数,16進数で表現する)を利用させてもらいました)

エクセルを使われているユーザが多いだけに、こういうところの誤差が影響するところもあるはずだけど、どれだけの人が知っているのだろうか。場合によっては影響が大きいだけにかなり必須な知識、というか知っておいて欲しい知識です。

(参考)エクセル奇譚 〜 誤差アラカルト 〜に同じコトが詳しく書かれてました。