- ベストアンサー
五捨五入
エクセルで五捨五入を行う場合は、どのような数式を作成すればよいのでしょうか。また、VBAでround関数を使うと五捨五入になると聞いたのですが、どのようなユーザー定義になるのですか。よろしくお願いします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 通常、偶数丸め(銀行型丸め)というと思いますが、ExcelのVBAでは、偶数丸めというのは、Excel2000 から採用されましたので、歴史的にも浅いです。いわゆる、2進の計算で、浮動小数点誤差丸めに、正式な名称「最近接偶数丸め」として出てくるだけで、実務上でワークシートなどで使う場を知りません。統計には出てくるそうですが、なぜ、銀行型丸め(Banker's Rounding)というのか、そういう歴史的な背景を私は知りません。 ご質問者さんが、どういう状況で必要になるのか少し興味を持ちました。以前にもそのような質問に出会ったことがありました。 現実的な対応は、VBAのユーザー定義関数を使うにしても、原理は、以下のようになるはずです。以下の数式を見れば分かるとおり、 丸める桁が、奇数の場合、その下の桁の数字を四捨五入、偶数の場合は、下の桁が上の桁の半分よりも小さい場合は切り捨てになりますね。 =IF(MOD(INT(MOD(ABS(A1),10)),2), SIGN(A1)*ROUND(ABS(A1),0), SIGN(A1)*ROUND(ROUNDDOWN(ABS(A1),0)+(ABS(A1)>(ROUNDDOWN(ABS(A1),0)+0.5))*0.5,0)) 小数点第一位の場合は、 =IF(MOD(INT(MOD(ABS(A1)*10,10)),2), SIGN(A1)*ROUND(ABS(A1),1), SIGN(A1)*ROUND(ROUNDDOWN(ABS(A1),1)+(ABS(A1)>(ROUNDDOWN(ABS(A1),1)+0.05))*0.05,1)) 少し、数式は、ややこしいですが、理屈は、単純なことだ思います。 質問者さんが、銀行型丸めを要求している話で、既存のVBAのRound関数をそのまま使う分には、出された結果がそのとおりだと思います。 >少数桁が大量にあった場合(?)は、どのように設定すればよろしいでしょうか。 >このVBAをしようした場合の有効桁は2ケタということになりますでしょうか。 そのままの計算でしたら、有効桁数は関係ないのではありませんか? つまり、浮動小数点の無限小数が存在していても、判定が、その半分よりも大きい・小さいには、有効桁数はありませんね。 >たとえば、2.501だった場合は「2」にはならず「3」になるということでしょうか。 私が説明してよければ、こういうことになると思います。 1桁で丸める場合は、1桁が偶数2だから、その下の桁の数値0.501が、丸める桁の半分0.5よりも多いので、四捨五入されて、3になります。2.5でしたら、半分[よりも]大きくない(以上ではなくて)ので、切捨てになるという仕組みだと思います。だから、Excelの仕様の小数点第16位以降は別としても、基本的には有効桁数は関係ありませんね。 ただ、私は実際には出会ったことのない計算です。
その他の回答 (7)
- ham_kamo
- ベストアンサー率55% (659/1197)
No.5です。 > このVBAをしようした場合の有効桁は2ケタということになりますでしょうか。 2桁というか、五捨五入はNo.3の方に補足にあなたも書かれているように、 「丸め単位の丁度まんなかで、どっちつかずの場合は、偶数側を採用する」 なので、2.5なら丁度まんなかですが、2.51にした時点で真ん中にならなくなります。なので3になってしまいます。 2.51…(あとも続く)を2に丸めたいときは、いったん小数点以下第2位で切り捨てを行い、それを五捨五入するという方法があります。 =Round5(ROUNDDOWN(2.51,1),0) とすると、2.51がいったん2.5に丸められ、それが五捨五入されて2という結果になります。
- nicotinism
- ベストアンサー率70% (1019/1452)
銀行型丸め と言われているものです。 こちらの解説が詳しいです。 丸めを行うカスタム プロシージャを実装する方法 http://support.microsoft.com/default.aspx?scid=kb;ja;JP196652
- ham_kamo
- ベストアンサー率55% (659/1197)
本当ですね、VBAのRound関数は五捨五入ですね。私もはじめて知りました。 これを利用したユーザ定義関数です。 Alt+F11でVBAの画面を開き、左側のツリーからブック名を選択し、右クリックから「挿入」>「標準モジュール」を選択して、右の画面に以下のマクロをコピーして貼り付けてください。 Function Round5(N As Double, Optional e As Integer) As Double Round5 = Round(N, e) End Function 貼り付けたらVBAの画面は閉じてかまいません。 使い方はワークシート関数のROUNDと同じです。 シート上で、 =Round5(2.5) とすると2に、 =Round5(3.5) とすると4に、 =Round5(0.25,1) とすると0.2に =Round5(0.35,1) とすると0.4にそれぞれなります。
#2です すいません。訂正です Round55 = Round(myR, 1)
- p-applepie
- ベストアンサー率53% (156/290)
五捨五入ということですが 5はどう処理されるのでしょうか? ちなみにROUND関数は四捨五入です。 ユーザー定義を使用しなくても、通常の関数として用意されています。 http://allabout.co.jp/study/pcbasic/closeup/CU20040521A/ 表示形式だけを変更して、データは変えずに見た目だけを 小数点以下四捨五入も可能です。 http://www.relief.jp/itnote/archives/000432.php
補足
「偶数丸め」は四捨五入とほぼ同一ですが、次の1点が違います。 「丸め単位の丁度まんなかで、どっちつかずの場合は、偶数側を採用する」 したがって、1.25 を 0.01 の位で丸めると 1.2 になり、1.35 は 1.4 になり ます。
詳細が分からないので簡単なサンプルです。 小数点以下2桁を1桁に五捨五入します。 エラー処理等はしていません。 Function Round55(Rng As Range) As Double Dim myR As Double myR = Rng.Value Round55 = Round(Rng, 1) End Function
- sikou-sakugo
- ベストアンサー率23% (74/314)
すみませんが・・・。“五捨五入”というのは矛盾していませんでしょうか? “四捨五入”なら理解できますが。
補足
貴重な回答をありがとうございます。 ご質問なのですが、このVBAをしようした場合の有効桁は2ケタということになりますでしょうか。たとえば、2.501だった場合は「2」にはならず「3」になるということでしょうか。 少数桁が大量にあった場合(?)は、どのように設定すればよろしいでしょうか。