• ベストアンサー

計算式の間違いか?引数が悪いのか?

A1セルに 3.3、 B1セルに 3があり、 C1セルに if(A1-B1=0.3,(A1-B1)*10,(A1-B1)*100)とすると真となり3を返す。 A2に13.3、 B2に13があり、 C2にC1をコピーすると偽となり30を返す。 B列はA列の整数部分を抽出した値が返っている。 C2を手入力しても、やはり30を返す。 なぜC1とC2に差が出るのか、全くわからない。 数値データを時間データに変換したいのだが、どうしたらよいのかわからない。 引数は15、3、45だけです。 どなたか教えてください。お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

エクセルの小数点の取扱によるものです。 既に回答されていますので添付のサイトをご参照下さい。

参考URL:
http://pc.nikkeibp.co.jp/pc21/special/gosa/
miyasabo
質問者

お礼

非常に参考になりました。 リンクまでつけていただき、リンク先もとてもよかったです。 またの機会があれば、その際にもよろしくお願いいたします。

その他の回答 (2)

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

例えばD1セルに=A1-B1と入力し、D2セルには=A2-B2と入力して二つのケースの数値を調べてみてはどうでしょう。 D1セルでは0.300000000000000 D2セルでは0.300000000000001 となってD2ではA2とB2の差は正確に0.3とはなっていません。そのために式では差の100倍の値となってしまったのです。 このような誤差を解消するためには有効数値をある桁までにするなどの工夫が必要となりますね。 例えばお示しの式を次のような式にするのもよいでしょう。 =IF(ROUND(A1-B1,2)=0.3,(A1-B1)*10,(A1-B1)*100)

miyasabo
質問者

お礼

非常に参考になりました。 またの機会があれば、その際にもよろしくお願いいたします。

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.1

小数点の数の計算は、1回演算するごとに誤差が生じているためです。 13.3 - 13 = 0.3。 この0.3という数値は、人間の十進法では小数点第一位で割り切れていますが、コンピュータの二進法の世界では無限少数となって割り切れていません。 計算した結果は0.300000001 になっているかもしれないし、0.2999999999 かもしれない。 でも、表示上は、小数点以下8位とか16位を四捨五入して、0.3と表示されています。 そういうわけで、計算された0.3と、直接書いた0.3には違いが出てきてしまうのです。 (セルの表示書式を、0.################## とかにすると見えるかもしれません。) 整数ならばともかく、少数同士をイコールで比較することは、実は避けなければなりません。 また一見、整数に見えていても、それが計算結果によるものだったら、見えていない少数桁がある可能性もあり、やはりイコールで比較できなくなってきます。 どうしても、2数が等しいことを調べたい時は、欲しい有効桁数以上に近い、ということを調べれば良いでしょう。 例えば、小数点第一位まで一致していることを確認したいなら、2桁ぐらい余裕を見て、 if(A1-B1<0.001, "一致", "不一致") このようにすれば、多少の誤差があっても一致と判断できますよね。

miyasabo
質問者

お礼

短時間でのご回答ありがとうございました。 非常に参考になりました。 2ケタ・・・確かに*100すると、正しい答えが出ることを確認しておりました。 またの機会があれば、その際にもよろしくお願いいたします。

関連するQ&A