[[20170808140038]] 『引き算の答えをCOUNTIFすると0.1がカウント(認識)』(長調婦人) ページの最後に飛ぶ

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

 

『引き算の答えをCOUNTIFすると0.1がカウント(認識)されない』(長調婦人)

よろしくお願いします。
例えば、

  A   B  C
1 5.0−4.7=0.3
2 5.2−5.1=0.1
3 5.0−5.0=0.0     (−、=記号は関係ありません)
4 5.3−5.4=−0.1
5 4.8−5.3=−0.5

引く数(B列)、引かれる数(A列)共に小数1位までの数です(セルに手入力しています)
答え(C列)は数式(=A1−B1)で、1.5〜−1.5程度の数字です。

この答え(C列)の各数字の個数をCOUNTIFを使って数えたいのですが、0.1と−0.1だけカウントされません。なぜなら、COUNTIFのウインドウ(関数の引数)で範囲指定(C列)すると右側の「=参照」の所に本来なら
={0.3;0.1;0;−0.1;−0.5}と表示されるはずなのに

={0.3;0.10000000001;0;・・・・・と、0.1と−0.1だけおかしな数を認識してしまっているからです。

どうしてこのような現象が起こるのでしょうか?どのように対処したら良いでしょうか?

< 使用 Excel:Excel2013、使用 OS:Windows2000 >


 小数点誤差と思われます。

 10倍してから10分の1にしたらどうかと。

 =(A1*10-B1*10)/10

(1111) 2017/08/08(火) 15:42


回答ありがとうございます。

なるほど、確かに =(A1*10-B1*10)/10 でカウントされるようになります。
ありがとうございます。

でも、今ひとつスッキリしないといいますか・・・・
0.3とか、他の数字は大丈夫なのにナゼ0.1と−0.1だけおかしいんだろう?と思ってしまうのです。
シートを変えたり新しいブックでやってみたりしたのですが、同じ現象が起こってしまいました。
私のPC(エクセル)だけに起こる事象なのでしょうか?
ここに質問する前に エクセル関数を解説したHPをいろいろ調べましたが、そのような注意喚起の記載は見当たりませんでした。

・・・・って愚痴になってしまいました。ごめんなさい。
回答ありがとうございました。

*10/10で対処します。

(長調婦人) 2017/08/09(水) 09:15


 「EXCEL 演算誤差」でネット検索してみてくれ。
 簡単に言うとEXCEL内部では10進数ではなく2進数で計算していることと計算時の桁数に限りがあるためにおこる。
(ねむねむ) 2017/08/09(水) 09:19

 >0.3とか、他の数字は大丈夫なのにナゼ0.1と−0.1だけおかしいんだろう?

 他の数字は「たまたま」大丈夫だっただけです。

 小数を使った計算にはいつも誤差が生ずるリスクがあります。
 その誤差がいつ現実化するかも、我々レベルのユーザーには予測できません。

  行  __________A__________  __B__  _____________________________________C_______________________
   1                                                  BITイメージ                                
   2                           5.2   +101.00110011001100110011001100110011001100110011001101
   3                           5.1   +101.00011001100110011001100110011001100110011001100110
   4  A2-B3                    0.1   +0.0001100110011001100110011001100110011001100110011100
   5  手入力                   0.1   +0.0001100110011001100110011001100110011001100110011001101
   6  =B4-B5=0               FALSE  手入力の0.1と違う                                             
   7                                                                                              
   8                                                                                              
   9                             5   +101.00000000000000000000000000000000000000000000000000
  10                           4.7   +100.10110011001100110011001100110011001100110011001101
  11  A9-B10                   0.3   +0.0100110011001100110011001100110011001100110011001100
  12  手入力                   0.3   +0.010011001100110011001100110011001100110011001100110011
  13  =B11-B12=0             FALSE  これも手入力の0.3とは違う                    
  14                                                                             
  15  どんだけ違うのかと言うと、「0.5の54乗」の大きさで3個分です。               
  16  =(B12-B11)/0.5^54          3                                               
  17                                                                             
  18  =COUNTIF(B2:B12,0.3)       2                                               
    その違いがあってもCountifの条件「0.3」では同じと判定された。               

    極限の微小な差異がどう扱われるのか、我々レベルでは分からない。             
     ※微細なプラス数値をINT関数で処理すると、元の数値より大きくなったりすることもあります。
     つまり、切り上がっちゃうんです。

  10倍すれば旨く行くと言うのも、(実際、旨く行くんですけど)
  その理屈が私はよく分からないです。2進数誤差を10倍するだけではないかと思うので。

  10倍で旨く行くなら、10000倍でも、100000倍でも(同じ理屈として)旨く行くはずですが、 
  10000倍はOK、、100000倍はNGです。

  扱う数値が、小数点以下1桁と決まっているのでしたら
   =A1-B1  → =ROUND(A1-B1,1) とします。(私ならですけど)

(半平太) 2017/08/09(水) 10:48


更なる回答ありがとうございます。

10進数とか2進数とか、全く意識になく、ただ、エクセルが出してくれた答えは100%正解と思い込んでいました。
丁寧に説明して頂てありがとうございます。ピンとは来ませんが、ムムム、そういうことか・・・という気分です。それに、

「他の数字は「たまたま」大丈夫だっただけです。」
「小数を使った計算にはいつも誤差が生ずるリスクがあります。」と、断言して頂き、スッキリしました。

「EXCEL 演算誤差」検索してみました。結構いろいろあるのですね。少しずつ読んでいこうと思います。

イラッとしていた事象でしたがスッキリしたら何か面白いです。
「10000倍はOK、、100000倍はNGです。」ナンデ〜!?・・・面白いですね。

回答いただいた皆様ありがとうございました。

(長調婦人) 2017/08/09(水) 14:56


コメント返信:

[ 一覧(最新更新順) ]


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