[[20180513162118]] 『以上、未満について』(MARK) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『以上、未満について』(MARK)

とある、時間計算をしています。

A2に開始、B2に終了の時刻
C2にB2-A2
D2に=IF(C2<$D$1,"○","") D1には0:03と入力有
E2に=IF(AND(C2>=$E$1,C2<$F$1),"○","") 
E1に0:03 F1に0:05と入力 E2とF2はセル結合
G2に=IF(AND(C2>=$G$1,C2<$H$1),"○","")
G1に0:05 H1に0:10と入力 G2とH2はセル結合
I2に=IF(C2>=$I$1,"○","")
I1に0:10と入力

しました。

A2とB2に時間を入れずにC2の式も消し、C2に「0:01」「0:08」など入力すれば、D列以降の関数は反応するのですが、C2に式を入れ、A2とB2に時刻を入力すると、ある一定の時刻の時に、
以上、未満で反映(以上なのに未満で〇が入ってします)されません。
なぜでしょうか?

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 小数(時間データもこれに該当する)を計算すると、小数演算誤差と云う厄介な現象が入り込んできます。

 そうするとピッタリのハズなのに、人間が考えるより少し大きかったり、小さかったりします。
 なので、ピッタリかどうかの判断を止め( = は使わない)、代わりに1秒程度、水増しするか、目減りさせる。

 例 A >= B としたければ、A > B - "0:0:01" とする
     A <= B としたければ、A < B + "0:0:01" とする

(半平太) 2018/05/13(日) 16:46


やってみます。

ただ、A2とB2に時間を入れずにC2の式も消し、C2に「0:01」「0:08」などを手打ち入力するだけなら、
これら関数は反応してるのに、A2に開始時刻、B2に終了時刻を入力し、C2をB2-A2とした場合、
ある時間(例えば1時台や20時台)だと狂い、別の時間だと狂わず関数の通り“〇”が入力
されるのです。

そこがわからないのです。

全ての時間帯で、同じ現象になるのであれば理解できるのですが・・・
(MARK) 2018/05/13(日) 17:43


 >手打ち入力するだけなら、 ・・・
 >C2をB2-A2とした場合、 

 四則演算をしない場合は、小数演算誤差は発生しません。
               ~↑~~
               演算したら、です

 >全ての時間帯で、同じ現象になるのであれば理解できるのですが・・・

 そんなキッチリとした誤差なら、スッキリした解決策が採られています。

 実際は、大きかったり、小さかったり、同じだったりするんです。

 普通の人はそれがどうなるのか予測できません。

 頭のいい人なら予測は出来ますが、
 こんな程度の計算に頭をフル回転させるなんてことは、頭がいいのでやらないです。

 あと、「水増し、目減り」とは別の方法として、手打ちと同じ精度に変換する方法が有ります。

 = B2-A2
  ↓
 = Text(B2-A2,"[h]:mm")*1 ←こう云う数式に変えます。

(半平太) 2018/05/13(日) 19:24


 余談として、
 比較演算子ですら差異を判定できない演算誤差を体験できる例を...

 A1に「=1/3」の数式を設定
 B1にA1の結果を値だけコピペ
 2行目に「1行目×3」の数式を設定(A2「=A1*3」、B2「=B1*3」)
 3行目に2行目の結果が文字列になる式を設定(A3「=A2&""」、B3「=B2&""」)
 C列に「A列はB列と等しいか?」の判定数式を設定(C1「=A1=B1」、C2「=A2=B2」)

 C1の結果はTRUE。C2の3倍した結果もTRUEであることを確認
 3行目の表示結果も両方「1」であることを確認

 B1セルを選択し、数式バーに入って、そのままエンター(手打ちの値に変換する為の操作)

 C1の結果はTRUEのまま変化しないにもかかわらず、C2の3倍した結果だけがFALSEに変わったことを確認
 3行目の表示結果もB列だけ「0.999999999999999」に変わったことを確認

 A1の「0.333333333333333」(演算)と
 B1の「0.333333333333333」(手打ち)との間には
 比較演算子「=」で認識出来ないほど僅かな差異がある様だ

 という事が確認できます。

(白茶) 2018/05/14(月) 11:58


半平太様 ありがとうございました。
=TEXT(B2-A2,…..

の関数を入力したら、解決できました。
ありがとうございました。
(MARK) 2018/05/16(水) 07:53


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.