- ベストアンサー
Excelでの小数点の計算
小数点以下の部分で計算が上手くいかず困っています。 Excelのバージョンは2007です。 そして、各セルの内容は次の通りです。 A1:8347 B1:4.04 C1:8.66 D1:B1+C1 E1:D1-(3.5+8.3) F1:ROUNDDOWN(A1*E1,1) F1のセルの答えは小数点第2位で切り捨てしなければなりません。 そうすると、答え変わってしまい、正しい結果になってくれません。 この場合の対処法があれば教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ポイントはE1の=D1-(3.5+8.3)ですね。D1が12.7なので11.8を引いて 0.9になって欲しいところですが、いわゆる「丸め誤差」によって 0.89999999999999900000 になります。そうすると8347をかけた時も 5712.3にならず7512.29999999999000000000 になり、切り捨てると 0.1足りないってことになるわけです。 解決策ですが、E1のところで=(D1*10-(3.5+8.3)*10)/10 のような姑 息な手で丸め誤差を回避するか、最期の切り捨ての直前にチョット 下の桁で四捨五入して=rounddown(round(A1*E1,2),1) とするか、で すね。私は後者かな。
その他の回答 (3)
- chie65536
- ベストアンサー率41% (2512/6032)
確かに「A1*E1」を表示させると「7512.3」ですし、それをROUNDDOWN関数で切り捨てすると「7512.2」になりますね。 期待する結果「7512.3」と「A1*E1」の差を計算してみましょう。 F2 :=7512.3-A1*E1 F2には「1.18234E-11」と表示されます。 実は「A1*E1の値」は「7512.3より、0.0000000000118234....だけ小さい」のです。つまり、計算誤差で「7512.29999999999881765...」になっています。 「7512.29999999999881765...」を「小数点第2位で切り捨て」すれば、当たり前のように「7512.2」になります。 誤差を吸収する場合は =ROUNDDOWN(VALUE(TEXT(A1*E1,"#.##")),1) と言うように「計算結果をTEXT関数で文字列に変換して、それをVALUE関数で数値に戻してから、小数点2位以下の切り捨て」をしましょう。
お礼
回答、ありがとうございます。 一度、テキストに変換してから、数値に戻す方法。 思いつきもしませんでした(-_-;) 大変、勉強になりました。
- garaogu
- ベストアンサー率40% (67/166)
こんにちは 下記のように固定数値をすべて10倍し、F1で100分の1にするのでは如何でしょうか? A1:83470 B1:40.4 C1:86.6 D1:B1+C1 E1:D1-(35+83) F1:ROUNDDOWN(A2*E2/100,1)
お礼
回答、ありがとうございます。 もともとの値は他の部分でも使用していて、そういう変更は加えられないんです。 他の部分を10分の1で表示させれば良いだけかもしれませんが…。
- FEX2053
- ベストアンサー率37% (7991/21371)
追試しても「この値では」正しい結果になるんですけどね。 だとすると、理由は2つのどちらか。 1.そもそも「正しい」と思っている計算と、Excelでやってる計算が違う。 計算順序の違いとか、式の立て方、単なる入力ミスとか、その手のミスが 原因で数値が狂うことは、式が複雑になると結構ある。 2.Excelの小数点以下の計算誤差。詳細はこちらを http://pc.nikkeibp.co.jp/pc21/special/gosa/ 掛け合わせる数値の絶対値の差が大きいと、結構大きな誤差になります。
お礼
一番早い回答、ありがとうございます。 小数点の誤差、プログラムを勉強していた時の事を思い出しました。
お礼
回答、ありがとうございます。 後者の方はすっきりしていて、良いですね!! 後者の方を使用させてもらいます。