Windows

52. Excel の丸め誤差

あるFacebookの投稿に次のような投稿があった。
これは投稿者の許可を得て紹介するものである。

Excelのセル計算で 7.3 – 7 = 0.3 であるが
8.3 – 8 は 0.3とはならず 0.3000000000001 のように
小数以下15桁の差異が発生するというものである。
以下同じように次のような誤差が次々と発生する。

投稿者は給与計算でこの誤差のために
間違いを生じたと指摘していた。
他のコメンテータはExcelなどの表計算ソフトは
信用していないので専用の別売ソフトを使っていると
コメントしていた。
これは実は投稿者の使い方が間違っていたのではなく
Excelの内部プログラムのバグでもない。
コメンテータのように他の表計算ソフトを使っても
同じような誤差は発生してしまうのである。

Windowsを使っている限り内部は2進数で計算されて
いるので2進数の数値を10進数の数表現に戻すときに
誤差が発生してしまう。

小数計算の誤差 0.1 + 0.2 が 0.30000000000000004 になる理由

それではIBM iはどうだろうか?
IBM iのデータ・ベースは内部処理から10進数として
設計されている。
PACK10進数やゾーン10数では符号のF(=正の数)または
D(=負の数)以外のA~Fは見たことがないだろう。
内部は0~9の数字だけで構成されている。
従ってIBM iでは2進数から10進数に戻すという作業は発生しないので
このExcelのような誤差が発生することはない。

ところがIBM iの業務をWindowsのアプリに変えてしまうと
緻密な計算を要する会社だけでなく前述の投稿者の話にあるように
給与計算だけでもこの問題が発生してしまうことがある。
元々Windowsはパーソナル・ユースとして起源を有するものなので
業務に使おうとすると様々な問題が発生してくる。
ビジネス開発の経験のないSEたちが設計したのがWindowsなので
ビジネスには向いていないのも当然である。

WindowsではC#、VisualBASIC などどんな言語を使って開発したとしてもこの問題が発生するのを
避けることはできないのである。
ただしJavaだけは10進数データ・ベースを定義することができるが
今ではJavaの高額な使用料が発生してしまう。
IBM iをWindowsに変更しようとするのは早計で
場合によっては深刻な問題を起こしかねない話であった。