推しミネラルウォーターはありますか?

エクセルで五捨五入を行う場合は、どのような数式を作成すればよいのでしょうか。また、VBAでround関数を使うと五捨五入になると聞いたのですが、どのようなユーザー定義になるのですか。よろしくお願いします。

A 回答 (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位以降は別としても、基本的には有効桁数は関係ありませんね。

ただ、私は実際には出会ったことのない計算です。
    • good
    • 1

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という結果になります。
    • good
    • 0

銀行型丸め と言われているものです。


こちらの解説が詳しいです。

丸めを行うカスタム プロシージャを実装する方法
http://support.microsoft.com/default.aspx?scid=k …
    • good
    • 0

本当ですね、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にそれぞれなります。

この回答への補足

貴重な回答をありがとうございます。
ご質問なのですが、このVBAをしようした場合の有効桁は2ケタということになりますでしょうか。たとえば、2.501だった場合は「2」にはならず「3」になるということでしょうか。
少数桁が大量にあった場合(?)は、どのように設定すればよろしいでしょうか。

補足日時:2007/03/25 00:09
    • good
    • 1

#2です


すいません。訂正です
Round55 = Round(myR, 1)
    • good
    • 0

五捨五入ということですが 5はどう処理されるのでしょうか?



ちなみにROUND関数は四捨五入です。
ユーザー定義を使用しなくても、通常の関数として用意されています。

http://allabout.co.jp/study/pcbasic/closeup/CU20 …

表示形式だけを変更して、データは変えずに見た目だけを
小数点以下四捨五入も可能です。

http://www.relief.jp/itnote/archives/000432.php

この回答への補足

「偶数丸め」は四捨五入とほぼ同一ですが、次の1点が違います。
「丸め単位の丁度まんなかで、どっちつかずの場合は、偶数側を採用する」
したがって、1.25 を 0.01 の位で丸めると 1.2 になり、1.35 は 1.4 になり
ます。

補足日時:2007/03/24 23:06
    • good
    • 1

詳細が分からないので簡単なサンプルです。


小数点以下2桁を1桁に五捨五入します。
エラー処理等はしていません。
Function Round55(Rng As Range) As Double
Dim myR As Double
myR = Rng.Value
Round55 = Round(Rng, 1)
End Function
    • good
    • 0

すみませんが・・・。

“五捨五入”というのは矛盾していませんでしょうか?
“四捨五入”なら理解できますが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報