プロが教えるわが家の防犯対策術!

添付した表のセルI2に113.879と表示されていることが確認できると思いますが、(ABS($D$2:$D$7921-H2)>=0.3)の0.3を0.299に変えると113.862が表示されます。
ABS(113.862-113.562)=0.3のため、式が0.3のままでも113.862が表示されるべきだと思うのですが、なぜ表示されないのでしょうか?

ちなみにI3以下のセルはI2をオートフィルしたものなのですが、I6ではちゃんと0.3ピッタリの値でも表示されています。

どなたか原因が分かる方いませんか?

「0.3以上の時に数値を表示したいのに、0」の質問画像

質問者からの補足コメント

  • 皆様回答頂きありがとうございます!大変助かりました!
    元データがおかしいのかなとも思ったのですが、二進法による問題だったのですね…大変勉強になりました!
    皆様がBAなのですが、最も分かりやすく、代替式も書いていただいた方をBAにさせていただきます!
    回答頂きありがとうございましたm(__)m

      補足日時:2021/12/26 15:26

A 回答 (5件)

>どなたか原因が分かる方いませんか?


とのご質問ですが、既に複数の方が指摘しておられます。
以下のURLをご覧ください。
https://en-light.net/archives/30482

EXCEL内部ではIEEE754の規格に基づき2進数で浮動小数点運算が行われています。小数点以下の数値は場合によって2進数の無限小数となりますが、EXCELのセル数値の有効桁数は15桁のためどうしても誤差が生じます。

ご質問のケースもこれが原因で思った結果にならないということです。

これを回避するには、計算桁数を予め決めてしまう方法があります。

ご質問者の掲示された表をみるとデータは小数点以下3桁で入力されているように見えます。もしかしたらそれ以上の桁数のデータを表示形式で小数点以下3桁に見せているのかも知れません。
仮に、表示形式で小数点以下3桁に見せているのだとしても、計算精度を小数点以下3桁と決めてしまえば、見えている状態で計算した結果と一致することになります。

そこで、I2に

=INDEX(FILTER($D$2:$D$7921,(ROUND(ABS($D$2:$D$7921-H2),3)>=0.3)*($A$2:$A$7921=F2)*($B$2:$B$7921>=G2)),1)

という数式を記述し、下方向へオートフィルするという方法はいかがでしょうか?
    • good
    • 0

》 なぜ表示されないのでしょうか?


Excelに限らず、PCには、小数点を含む計算は苦手という弱点があるからです。
式 =(ABS($D$2:$D$7921-H2) の結果は 0.3 とお思いでしょうが、生来の弱点のために、Excel は 0.299999999999999… と思い込んでいるのです。

》 I6ではちゃんと0.3ピッタリの値でも表示されています
弱点はショッチュー発生するわけではないので、たまにはそうなりますよ。

=ABS(A1*1000-A2*1000)/1000
だと、1000で割るまでは小数点のない計算だから…
    • good
    • 0

その数値が計算結果の0.3ではなく0.3と入力していればそれは0.3ですがABS(113.862-113.562)の計算結果を数値にし小数点以下の桁数を増やしていくと0.299999999999997となり0.3とはなりません。



表は通貨で小数点以下は固定のようなので以下のように元の数値を1000倍して整数にしてから結果を1000で割れば正しく計算できます。
ABS(113862-113562)/1000
または
ROUND(ABS(113.862-113.562),3)


おまけ
=(0.3-0.2-0.1)

=0.3-0.2-0.1
と結果を比べてみてください。
    • good
    • 1

コンピュータ内部は全て2進数です。


0.3ピッタリになんか不可能です。
その為の誤差です。
0.3=2進では0.0100110・・・・永遠に続く
    • good
    • 0

>どなたか原因が分かる方いませんか?


今回の原因かはわかりませんが、
コンピュータの内部は2進数で計算しているの知ってますか?
ABS(113.862-113.562)=0.3
本当?

整数同士の差ならいざ知らず、小数以下を含む数は、厳密にいえば近似値ですよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!