小計と合計が合わない
はじめに
入社1年の59歳の新人です。 数十年ぶりのプログラムで苦戦していますが、その記録です。 EXCELのIF関数で小計の和と合計を比較して集計が間違いを検出するようにIF関数で対応しました。
IF(合計=小計の和,””,”集計が違います”)
いざ使ってみると、小計の和と合計があっているはずなのに”集計が違います”と表示されました。 今回は、このデバッグです。
デバッグ開始
デバッグ開始です。 まずは、表示と数値に不一致を疑いました。
表示が整数でしたが、表示設定を変更して小数点を表示するようにしてみたら、小数もありました。
小数の誤差の問題と考え、小数で小計と合計を確認しましたが、ここでの計算は問題ありませんでした。 次に小数点以下の桁数を増やしてみましたところ誤差が確認できました。
これが、よく聞く2進数の小数点の誤差だったんですね。 コンピュータで処理は、通常の10進数を2進数に変換して計算します。その際、整数は問題なく2進数に変換できますが、小数の多くはぴったり2進数に変換できません。このため誤差が発生します。 10進数の「0.1」は2進数で「0.000110011……」という循環小数になります。つまり、小数は無限に続きますので、無限の桁数があったとしても正確に計算できませんし、 コンピュータの桁数は有限ですので、どうしても誤差が出ます。
私の使っているEXCELでも以下の計算で2進数の誤差が確認できました。EXCELでもあったんですね。
①4.1-4-0.1 が0 にならない
②8.2-7.2-1が0 にならない
Data1 | Data2 | Data3 | 小計 (Data1+Data2+Data3) | |
Sample1 | 4.1 | -4 | -0.1 | -0.000000000000000360822483003176 |
Sample2 | 8.2 | -7.2 | -1 | -0.000000000000000888178419700125 |
小計 (Sample1+Sample2) | 12.3 | -11.2 | -1.1 | 0 / -0.000000000000001249000902703300 |
ほぼあってるけど、イコールじゃない。これが、小計の和と合計が合わない原因でした。
そこで、対策検討しましたが、微小誤差ですので以下のようにROUND関数を使って整数までの四捨五入することで解決することがわかりました。 IF(ROUND(合計=小計の和,0),””,”集計が違います”) 何とか、納品に間に合って一安心。
まとめ
今回の教訓です。
①表示と数値が不一致ある可能性があるので確認する。不一致があれば、表示と数値の不一致をなくす。(今回はやってませんが、、、)
②2進計算には小数点以下に誤差が含まれますので、ROUND関数で四捨五入して使う。(今回の対応内容)
新人のデバック記録でした。