- ベストアンサー
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」にならないのでしょうか?
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 四捨五入のことを、英語で、'ROUND'(名詞:円形) といいます。それを、そのまま日本語に直すと、「丸める」というのです。似たような用語に、「返す」という言葉がありますが、'RETURN' (動詞:戻る)です。これは、数学の用語だそうです。それと、もともと、VBAでは、Office 2000 までは、'Round'関数がなかったはずですし、四捨五入としては 'Round' は使いませんから。 それと、#6さんの紹介したサイトに、混乱させることを言うと、私の知っている範囲では、Excelのバージョンによって補正処置が違っていたはずです。Office 2007 では、違った印象を持ちました。もともと、補正技術は、各社各様ですが、MSで言う 「IEEE 754」とかいう話は、私には、時代遅れの言い訳に過ぎないと思うのです。少なくとも、昔の某社の技術を借りていた頃のMicrosoft 社製の表計算は、今ほど、誤差は出ませんでした。 それで、ワークシートの場合は、小数点を含むマイナスの演算に、「丸め誤差」が発生します。VBAは、例えば0.01~0.99 までの、四則演算のみならず、数値そのものの約半分に誤差が発生しますので、それを承知でプログラムを書かなくてはなりません。VBAのそれが生の状態とすると、ワークシート側は、補正されていることが分かります。 今回の数値は、小数点第2位までありますから、 =SUMPRODUCT(A1:A7*100)/100 と100倍して、100を割ります。この処理方法を「整数変換法」といいます。 それで、もしも、四捨五入するのでしたら、 =ROUND(SUMPRODUCT(A1:A7*100)/100,1) とすればよいです。もしも、こうした一括でする方法が思いつかないなら、補助列を使って、100倍して行うと良いです。 別の方法で、 =ROUND(FIXED(SUM(A1:A7),2,FALSE),1) この処理方法を、「小数点固定法」と呼んでいます。 この二つは、プログラミングで使われる手法です。 ただ、私は、こういう方法を好んで書いているわけではなく、この程度のレベルは、ユーザー任せにしないで、ソフトメーカー側が補正処理を施すべきではないかと思います。このほかにも、別の種類の丸め誤差が存在しますから、時間計算など、表示と内部の数値が違うものは、必ず検算しなくてはなりません。
その他の回答 (7)
- imogasi
- ベストアンサー率27% (4737/17069)
#6の御紹介もそうですが、Googleで「エクセル 丸め 誤差」で照会してみてください。沢山記事が出る中で、良さそうなものを拾い読みして、勉強してください。 http://www.kentei.ne.jp/quali/column/knowhow/030415.html ほか多数出る。 ここの質問コーナーに説明できる範囲を超えた問題です。コンピュターの数の表現など、基礎的な勉強がされて無いと、やたらにエラーを見つけたという、報告になりがちです。 エクセルは全世界の頭脳優秀者も使って色々な使い方もされて、見張られているはずです。既に大概のことはMSに報告され、掌握してるはずです。それでも諸条件をトレードオフして、現状のまま(カタチ)で行っていると思います。
- gyouda1114
- ベストアンサー率37% (499/1320)
あっしには良く理解できませんが こんなサイト見つけました 「※ 本項は上級者向けの資料。初心者は読むと混乱する可能性が高いのでオススメしない」と書いてありましたので念のため https://eip.econ.kanagawa-u.ac.jp/eip/excel-calc-error.html
- ASIMOV
- ベストアンサー率41% (982/2351)
その、=sum(a1:a7) が入っているセルの書式設定で 表示形式を「数値」 桁数を20桁くらいにしてみてください 7.84999999999999000000 と、表示されると思います これは、割と有名な話だと思うんですが エクセル内部では2進数で計算しているのでこのような誤差がでる様です 特にマイナスが付く計算では出やすいようです
- okormazd
- ベストアンサー率50% (1224/2412)
#2です。 すみません、vbaのround 関数と勘違いしてしまいました。 #2は取り消します。
- pepe_clift
- ベストアンサー率20% (52/255)
ROUNDってROUND、ROUNDUP、ROUNDDOWNの3種類があります。 UPは切上げ、DOWNは切捨てROUNDは四捨五入って書いてあるぞ!!! BUGかな?
- okormazd
- ベストアンサー率50% (1224/2412)
excelのround関数は単純な四捨五ではありません。 http://okwave.jp/qa4215450.html
- ookami1969
- ベストアンサー率14% (137/953)
ROUND ではなく ROUNDUPにすればOKです。
お礼
ご回答ありがとうございました。どうやら「銀行型丸め」ではなく、二進法からくる構造的な「誤差」のようですね。解消法はご回答のように、補助的な作業スペースを設けることにより、多段階に計算させた方がよさそうだと思いました。長い数式で一発計算させるよりも、この方が計算過程のチェックもできますし、効果的だと思いました。ありがとうございました。