• ベストアンサー

Excel 計算結果誤差

以下の様に計算させると小数3桁目の丸め方で差がでますなぜでしょうか? 例 (手入力)  A1    B1    C1     1.235   1.000  IF(MOD((A1-B1)*1000,10)=5,A1-B1,ROUND(A1-B1,2)) 求める解は0.235ですが0.240と表示されます 通常の4捨5入の処理をされてしまうのですがなぜでしょう教えてください。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 前の回答で、一応、こちらの数式もチェックしていただきたかったですね。 FLOOR(A1,0.005)+(MOD(A1*1000,10)>5)*0.005-B1 MOD((A1-B1)*1000,10) = 5 で、浮動小数点丸め誤差が発生しているから、小数点第14位目が、#2 の方のご指摘のとおりに、9になっていて、 「5」と等しくはなっていないわけです。だから、Excelの場合は、求める桁より外の値は、切り捨てるというのが一般的です。たとえば、時間計算なら、小数点第7位までとか。 整数変換法   INT(MOD((A1-B1)*1000,10))=5 小数点固定法  MOD(FIXED(A1-B1,3)*1000,10)=5   理屈は、両方とも同じです。 私は、なぜ、Microsoft は、このような仕様にしなければならなかったのか、疑問が残っています。今は、比較対象が限られていますから、単にExcelがどうこうという話しか出来ませんが、たぶん、このプログラム的な解決方法は、Lotus,Quadra,IBMなど各会社出してはあったし、かつては、Microsoft も対処していたのですが、Win-Excelになって、それを使えなかったことが原因だと思います。1991~2年頃に、LotusとMicrosoft共同で、この問題については発表がなされています。そうしないと、銀行など経理的な計算では大変な問題が発生する可能性があるからです。しかし、結局、Microsoft の一人勝ちのための、そのまま放置されたとも言えます。 ずいぶん前に、PC-VAN やTex で有名な三重大の奥村先生がこの問題を指摘していらっしゃるのですが、原因は、Microsoft が、「#IEEE 754 の double 型」をそのまま使っているということです。正直なところ、芳坂氏の説明は、丁寧に読みすすめましたが、あの説明では、私には良く分かりません。一応、元は雑誌の記事の内容ですから仕方がないと思います。表計算の場合は、ユーザーに対しては、その表計算上での対処法を提供すれば済むのではないか、と思っています。(maron-5さん、水を差してすみません。気を悪くなされないでください。)

vst-vst
質問者

お礼

遅くなりましてすみません。 解決いたしました。 問題の背景も含めご丁寧な回答ありがとう御座います。

その他の回答 (4)

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.4

◆的外れな回答で失礼しました ★これはやはり「演算誤差」でしょうか ◆ならば、下のURLを一度ご覧ください 「“達人”芳坂和行氏に学ぶ、エクセル(Excel)「演算誤差」対策講座」

参考URL:
http://pc.nikkeibp.co.jp/pc21/special/gosa/index.shtml
vst-vst
質問者

お礼

遅くなりましてすみません。 Excelを使っていくうえで大変参考になりした。 ありがとう御座います。

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.3

>求める解は0.235ですが0.240と表示されます ◆でも式が、ROUND(A1-B1,2) であれば、小数点第3位四捨五入小数点2桁表示のはずですので、0.235なら0.24は正動作だと思いますが?

  • gen_ma
  • ベストアンサー率31% (5/16)
回答No.2

Excelというよりコンピュータは、小数点以下の計算が苦手だそうです。 これを演算誤差とこのサイトで読んだことがあります。 =MOD((A1-B1)*1000,10)だけの結果ですが 実際excelに入れてみると5.00000000000009になりました。 これが原因では無いでしょうか。

vst-vst
質問者

お礼

遅くなりましてすみません。 Excelは計算が苦手とは・・意外した。 Excelを使っていくうえで大変参考になりした。 ありがとう御座います。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

A1、B1の数値を手入力した場合は期待する結果になるのではありませんか? もしかしてA1、B1の値は、計算式で求めていて、その結果をセルの書式表示で「小数点以下3桁まで表示」にしていないでしょうか。その場合小数点以下4桁目で四捨五入された結果が表示されています。 (例えば1.234999999が1.235と表示されている。だからMOD関数の結果が5にならない) A1、B1の式を  =ROUND(元の式,3) にすれば正しい結果にならないでしょうか

vst-vst
質問者

お礼

遅くなりましてすみません。 解決致しました。 ありがとう御座います。

関連するQ&A

  • dounle型で計算時の誤差

    今、VC++(MFC)で、15桁の数値まで表示可能な電卓アプリを作成しています。 そこで今つまずいているのが、double型で計算したとき(演算結果が小数の場合)の誤差の問題です。 とりあえず、いろいろなHPなどの情報を見たりして、誤差問題解決を下記のようにしました。 「数値の頭(左側)から16桁目を四捨五入する」 小数の場合はほとんど誤差が生じるため、計算後、計算結果が小数ならば、必ず 上記の誤差処理を行っています。 しかしこれでは、以下の場合に不具合が出てしまいます。 ・ 0.99 999 999 999 999 ÷ 10 = 本来の答えは「0.09 999 999 999 999 9」 ⇒ しかし15桁までの表示なので、本来は「0.09 999 999 999 999」と15桁まで出力     させなくてはいけないのに、16桁目の「9」を四捨五入したせいで「0.1」という表示に     なってしまう。 16桁目を四捨五入しないと誤差をとることはできないし、でも上記の例だと正しい結果 が出力されません。 どうしたらいいのか頭を悩ませています。 何か良い解決法等あれば、ご教授お願いします!!

  • excelの計算の仕方

    大変初歩的な質問なのですが・・・ excelで計算式の入力で、まず、A1のセルにに=3*1.8と入力するとします。小数点以下を0桁にすると、四捨五入されて、5と表示されると思います。 次に、B1に=A1*2.3と入力し、小数点以下を1桁にすると12.4になると思います。 でも・・・ この計算だと、B1のセルは、5*2.3ではなくて5.4*2.3になりますよね? ここで、5*2.3にしたい時は、B1にどういう計算式を入れたら良いのでしょうか? または、A1の数字を四捨五入前の数字で計算するのではなく、表示されている数字を固定(?)する方法とかないでしょうか? 大変わかりにくい説明で申し訳ありませんが、理解できて良い方法が思い当たる方は、教えてください。 よろしくお願いします。

  • エクセルの計算式の計算結果が合わないです。

    簡単な減価計算の計算式を作ったのですが、計算結果が合わず困っています。 A1に100,000,000 A2に=A1*0.15 B2に15 C2に=(1/B2)*2 とし、 一番求めたい計算式が =A2*C2なのですが、答えが2,000,000になります。 A2は15,000,000でC2は0.133(小数点以下3桁切り捨て)ですが、 乗算すると19,950,000にならないといけませんが、どうしても2,000,000になります。 誰か=A2*C2で19,950,000に計算がなる方法を教えてください。

  • エクセルの計算式で・・

    エクセルの計算式を=1.01*(A1)とし、1行のセルはこの計算式で求められているのですが、この計算結果の値を、小数点以下四捨五入するには、どのような数式にすると良いのでしょうか? 例)A1 500 B1 505 C1 510.05 D1 515.15 E1 520.30 F1 525.50 ...

  • エクセルで有効桁を指定して丸める

    以前、↓↓にて http://oshiete1.goo.ne.jp/qa1345491.html 「excelで普通に四捨五入をするとなると  『ROUND』などで小数点以下の桁数を指定しますよね。  そうではなく、有効桁数3桁で四捨五入…例えば、  0.1234ならば0.123  1.234ならば1.23  12.34ならば12.3  123.4ならば123…のように  数字を四捨五入させる関数(?)はあるのでしょうか。」 と質問し、 =ROUND(A1,-INT(LOG(A1))-1 + 3) とか =VALUE(TEXT(A1,"0.00E+00")) といった方法を教えていただいたのですが、 0.1234 なら 0.123 ・・・ 123.4 なら 123 までは同じなのですが、 1234.5 なら 1230ではなく1235 12345.6 なら 12300ではなく12346 つまり、1000未満の場合は以前と同じく有効数字3桁で 1000以上の場合は小数点以下四捨五入としたい場合は、 IF関数で =IF(1000>A1 ・・・のように条件指定してやるしかないのでしょうか。 (A1の部分にも長々した数式が入るもので) 数式がかなり長くなってしまい、見づらいので なにか良い方法があればと思ったのですが…

  • EXCELの小数計算について

    EXCEL97で小数計算をすると誤差がでるのですが何故ですか? A列に14.60を数値入力  B列に13.90を数値入力  C列に=B1-A1の数式をいれると-0.70となるはずなのにどういうわけか -0.699999999999999と表示される。 小数点以下14桁目までは-0.70000000000000と表示されるが15桁目で上記のように表示される。 表面上はROUND関数などで処理できるのですが複数の数式を組み合わせて計算している時は-0.69999・・・の数値をもって計算される場合があり誤差がでる。 消費税や金利計算などで1円でも誤差がでると表計算の正確さが問われてしまう。 0.7の他にも 次の場合もでる 0.2のとき0.1999・・ 0.3のとき0.2999・・・・ 0.8のとき0.7999・・・・ これはEXCELのバグなのでしょうか?

  • エクセルの計算式について

    =IF($E$19="","",IF($E$21="","",ROUND(K29/$E$21*$E$19,-1)))  この計算式だと四捨五入してしまいます。これのどこの部分を外せば四捨五入しない数値になりますか?

  • round関数について

    試しにエクセルで次の計算をしてみてください。 -16.76 7.9 -11.45 -8.88 -1 4.26 33.78 以上を全部足します。つまり「=sum(a1:a7)」です。当然「7.85」になります。 次に四捨五入します。round関数で小数点第2位を四捨五入して、第1位まで表示させます。つまり、「=round(sum(a1:a7),1)」ということです。すると「7.8」を返しました。 ん?「7.9」なのでは?と思い、次にこんな計算をしてみました。 A・・・=round(sum(a1:a7),2) B・・・=round(A,1) つまり、Aでいったん小数点第3位を四捨五入させた上で、その値を今度はBで小数点第2位を四捨五入させ、最終的に小数点第1位まで表示させたわけです。すると、ちゃんと「7.9」を返しました。 なんでこんな風になるのでしょうか?どうして一発で「7.9」にならないのでしょうか?

  • エクセルの関数を複数使いたい

    こんにちは、教えてください エクセルの関数を同時に複数使いたいときはどうしたらよいのでしょうか? 具体的には A1とA2を掛けて1000で割りたものをC1に表示させたいのです。 ただし、 (1)計算をしていないときにはC1に何も表示させたくない。 (2)小数点以下2桁で四捨五入したいのです。 (3)計算式をいったん別のところに表示させず、直接C1にだしたい。 以上の条件をかなえたいのですが、掛け算・割り算の式や、表示の条件を変えるのにIFを使用したり、四捨五入をするのはROUNDを使うのは発想できたのですが、組み合わせ方が分かりません。(表示形式で設定してしまうと、0.20などの際に0.2とはならないので・・・関数を使いたいのです) よろしくお願いします

  • エクセルの小数点を消す

    とある割合をかけて算出する計算式の答えが、小数点以下8ケタくらいの数字になりました。 ROUNDとかの関数を使えば、四捨五入されるのは知っていたのですが、それを忘れてしまったため、全ての答えに小数点以下の数字が入ってしまいました。 答えから、小数点以下を消したい(できれば四捨五入して)のですが、1コ1コ消していくのしかないのでしょうか??

専門家に質問してみよう