壁Cなぜだか計算違いが起こってしまう ( No.6 ) |
- 日時: 2004/07/22 03:42
- 名前: 管理人
- 計算が得意なはずのエクセルは、実は「計算間違い」を起こします。
これはコンピュータで計算を行う場合、二進数を使うことから起こる問題です。 整数では問題ないが、問題は少数です。
たとえば十進法の「0.1」も、二進法にすると「0.000110011001100〜」と延々と数値が続く形となり、「0.1」を正確にあらわすことができません。 あくまで、正確さを期すなら二進法でない計算法を採用すべきなのですが、二進法はコンピュータと相性が良く、高速で処理できる利点があります。エクセルの場合も正確さより、速度を優先したかたちとなりました。
もちろん、通常の処理ではこのような誤差はほとんど問題がありません。
エクセルでは、少数を二進法で変換する場合、ある桁数(最初の1がでてから54桁目)で切り捨てか、切り上げかを自動的に行っています。 そのため、「0.1」と表示されていても、実は0.1より少しだけ大きかったり、小さかったりします。通常の表示では、小数点以下の表示桁数がそれほど大きくないため、その違いが見えないまま計算され、知らない間に計算間違いを行っている可能性があるというわけです。
ですから、シリアル値自体が少数である「時刻」の計算の場合には特に注意が必要です。
<時間の計算時の対象法の例>
出社時間と退社時間から、勤務時間を求めるとします。 勤務時間は、退社時間から出社時間を引いた値です。 しかし、給与の計算上、勤務時間を15分単位で切り捨てることとします。
例) 出社時刻 20:00 退社時刻 22:00
勤務時間 2:00 = 22:00 − 20:00
FLOOR関数で、この勤務時間2:00がはいったD4のセルを15分ごとに切り捨てると(=FLOOR(D4,”0:15”))、1:45と言う値が求められました。 でも、実労は2:00のはずです。
このようなことが起こったのは、22:00 − 20:00の値が2:00と表示されているが、実際は2.00より少し小さい値のため1:45と表示されたと考えられます。
◆解決法1 給与計算は分単位に行うので、分に影響の与えない「0.1秒」を加算して、FLOOR関数を使う。「0.1秒」は誤差が生じる桁数より大きいので、この数値を加えることで、わずかにちいさかった数値が、表示時間(例では2:00)より大きくなるので問題を防げます。
例) 1.元の時刻に0.1秒を足す =D4+”0:00:01”
2.0.1秒足した時刻を15分単位で切り捨てる =FLOOR(G4,”0:15”)
◆解決法2 分の部分を整数化して計算する。 整数化する方法として、MINUTE関数で分を取り出す。
例) 1.時間データから「時」だけ取り出す =HOUR(D4)
2.「分」だけ取り出す =MINUTE(D4)
3.出した「分」をFLOOR関数で切り捨てる =FLOOR(F4,15)
4。時間データに戻す(シリアル値に戻す) =TIME(E4,G4、0)
 |
|