事務計算とコンピュータ

コンピュータによる計算では、時折面白いことが起きますが、 少し前、事務担当者から呼ばれた事例は、次のようなものでした。

ご本人が書いて、長年正常に動いていた awk のスクリプトが、 そのときだけ計算を間違え、 1 円の誤差が出たというのです。

その、間違えた計算というのは、次のような単純な数式で、

  金額 = 単価 * 数量
このときの単価は 130.2 円/kg、数量は 1000 kg でした。

人間は

  130.2 * 1000 = 130200
を期待しますが、コンピュータは

  130.2 * 1000 = 130199
と言ってきます。

問題のプログラムは下記のようになっていました。

  awk '
  BEGIN {
    u = 130.2   	# 単価
    a = 1000    	# 数量
    p = int(u * a)	# 円未満切捨て
    print u, "*", a, "=", p
    exit 0
  }'
実行すると、下記の結果が得られます。

  130.2 * 1000 = 130199
もちろん、c で書いても同じです。

#include <stdio.h>
#include <math.h>

main()
{
  double u, a, p;

  u = 130.2;		/* 単価 */
  a = 1000.0;		/* 数量 */
  p = floor(u * a);	/* 円未満切捨て */
  printf("%g * %g = %g\n", u, a, p);
}

お金の計算ですから、1 円の差を無視するわけにもゆかず、原因を明らかにして、 対策を考えなければなりませんが、理系の人々は日頃の訓練がありますから、 すぐピンとくるわけで、これ以上お読みになる必要はないと思います。

そうでなくて、この種の問題が始めてでしたら、 まず、原因を見つける努力をして、 それがうまくゆかないとき、残りをお読みになってください。

続く

平林 浩一, 2001