【VB.NET】Round関数 四捨五入の使い方

VB.NET
この記事は約9分で読めます。

Round関数 四捨五入の使い方

Mathクラス(System名前空間)にあるメソッドで四捨五入するときに使えるメソッド Round について説明します。

基本的な構文は

Math.Round(概数)
Math.Round(概数,オプション)
Math.Round(概数,桁数,オプション)

となります。

内容

注意点から説明しますが、小学校で習った四捨五入と少し違うと思います。
小学校を卒業して長いので最近は違うのかもしれませんが、私が習った四捨五入は、小数点以下を四捨五入する場合、

0.4 → 0
0.5 → 1
1.4 → 1
1.5 → 2
2.4 → 2
2.5 → 3
3.4 → 3
3.5 → 4
上記のような四捨五入でした。


前置き終了


Round 関数を実際に実行してみます。

Module Module1
    Sub Main()

        Console.WriteLine(Math.Round(0.4)) '0 に四捨五入
        Console.WriteLine(Math.Round(0.5)) '0 に四捨五入
        Console.WriteLine(Math.Round(1.4)) '1 に四捨五入
        Console.WriteLine(Math.Round(1.5)) '2 に四捨五入
        Console.WriteLine(Math.Round(2.4)) '2 に四捨五入
        Console.WriteLine(Math.Round(2.5)) '2 に四捨五入
        Console.WriteLine(Math.Round(3.4)) '3 に四捨五入
        Console.WriteLine(Math.Round(3.5)) '4 に四捨五入

    End Sub

End Module

恐らく、予想と異なる結果になっていると思います。
Round関数では、四捨五入した結果が奇数になる場合は、奇数側に寄せて、偶数になる場合は、偶数になるようにしているためです。
このような丸め方を「銀行丸め」とか「偶数への丸め」などといったりします。
「銀行丸め」の名称からも察しがつくと思いますが、大量の数字を扱う銀行システムなどで見られる四捨五入方法で、世間的にはこの方法が一般的です。

なぜこのようなわかりにくい丸め方をするかといえば、例えば1万個の小数点以下 .5 があったとします。全部繰り上げをしてしまうと、0.5ずつズレて、全体では、差異が5000円出来てしまいますが、奇数と偶数で切り捨てたり切り上げたりすると全体では誤差が小さくなる確率が高いためです。
対象 四捨五入 銀行丸め
0.5 1 0
1.5 2 2
2.5 3 2
3.5 4 4
合計 8 10 8

実際にはこんなに都合よくはないですが、偶数と奇数がほぼ同じ確率であらわれると仮定すればやはり銀行丸めの方が、全体の差異は少ないです。

銀行丸めでない四捨五入

銀行丸めが一般的なのは理解しましたが、「銀行丸め」でない、四捨五入をしたい場合も当然あります。その場合は、オプションで、 MidpointRounding.AwayFromZero を付けます。

Module Module1
    Sub Main()

        Console.WriteLine(Math.Round(0.4, MidpointRounding.AwayFromZero)) '0 に四捨五入
        Console.WriteLine(Math.Round(0.5, MidpointRounding.AwayFromZero)) '1 に四捨五入
        Console.WriteLine(Math.Round(1.4, MidpointRounding.AwayFromZero)) '1 に四捨五入
        Console.WriteLine(Math.Round(1.5, MidpointRounding.AwayFromZero)) '2 に四捨五入
        Console.WriteLine(Math.Round(2.4, MidpointRounding.AwayFromZero)) '2 に四捨五入
        Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero)) '3 に四捨五入
        Console.WriteLine(Math.Round(3.4, MidpointRounding.AwayFromZero)) '3 に四捨五入
        Console.WriteLine(Math.Round(3.5, MidpointRounding.AwayFromZero)) '4 に四捨五入

    End Sub

End Module

オプションで銀行丸めを指定することも出来ます。その場合は、MidpointRounding.ToEven を指定します。察しのいい方なら分かったと思いますが、要するに指定しない場合は、暗黙的に MidpointRounding.ToEven を指定していることになります。

Module Module1
    Sub Main()

        Console.WriteLine(Math.Round(0.4, MidpointRounding.ToEven)) '0 に四捨五入
        Console.WriteLine(Math.Round(0.5, MidpointRounding.ToEven)) '0 に四捨五入
        Console.WriteLine(Math.Round(1.4, MidpointRounding.ToEven)) '1 に四捨五入
        Console.WriteLine(Math.Round(1.5, MidpointRounding.ToEven)) '2 に四捨五入
        Console.WriteLine(Math.Round(2.4, MidpointRounding.ToEven)) '2 に四捨五入
        Console.WriteLine(Math.Round(2.5, MidpointRounding.ToEven)) '2 に四捨五入
        Console.WriteLine(Math.Round(3.4, MidpointRounding.ToEven)) '3 に四捨五入
        Console.WriteLine(Math.Round(3.5, MidpointRounding.ToEven)) '4 に四捨五入

    End Sub

End Module

 

小数点以下の桁を指定する

第二引数に正の整数を指定すると小数点以下の桁で四捨五入してくれます。

Module Module1
    Sub Main()

        Console.WriteLine(Math.Round(0.04, 1, MidpointRounding.ToEven)) '0 に四捨五入
        Console.WriteLine(Math.Round(0.05, 1, MidpointRounding.ToEven)) '0 に四捨五入
        Console.WriteLine(Math.Round(0.14, 1, MidpointRounding.ToEven)) '0.1 に四捨五入
        Console.WriteLine(Math.Round(0.15, 1, MidpointRounding.ToEven)) '0.2 に四捨五入
        Console.WriteLine(Math.Round(0.24, 1, MidpointRounding.ToEven)) '0.2 に四捨五入
        Console.WriteLine(Math.Round(0.25, 1, MidpointRounding.ToEven)) '0.2 に四捨五入
        Console.WriteLine(Math.Round(0.34, 1, MidpointRounding.ToEven)) '0.3 に四捨五入
        Console.WriteLine(Math.Round(0.35, 1, MidpointRounding.ToEven)) '0.4 に四捨五入

        Console.WriteLine(Math.Round(0.04, 1, MidpointRounding.AwayFromZero)) '0 に四捨五入
        Console.WriteLine(Math.Round(0.05, 1, MidpointRounding.AwayFromZero)) '0.1 に四捨五入
        Console.WriteLine(Math.Round(0.14, 1, MidpointRounding.AwayFromZero)) '0.1 に四捨五入
        Console.WriteLine(Math.Round(0.15, 1, MidpointRounding.AwayFromZero)) '0.2 に四捨五入
        Console.WriteLine(Math.Round(0.24, 1, MidpointRounding.AwayFromZero)) '0.2 に四捨五入
        Console.WriteLine(Math.Round(0.25, 1, MidpointRounding.AwayFromZero)) '0.3 に四捨五入
        Console.WriteLine(Math.Round(0.34, 1, MidpointRounding.AwayFromZero)) '0.3 に四捨五入
        Console.WriteLine(Math.Round(0.35, 1, MidpointRounding.AwayFromZero)) '0.4 に四捨五入

    End Sub

End Module

0:整数
1: 小数点1位まで
2: 小数点2位まで

省略した場合は、同じく暗黙的に 「0」 を指定した場合と同じになります。

また他の言語などをやったことがある人だと、負の整数を指定すると1の位や10の位で四捨五入出来そうにみえますが、vb.netでは、エラーになります。

Module Module1
    Sub Main()

        Console.WriteLine(Math.Round(104.1, -1, MidpointRounding.ToEven))
        'System.ArgumentOutOfRangeException:
        '丸める桁数は 0 から 15 までの間でなければなりません。

        Console.WriteLine(Math.Round(104.1, -1, MidpointRounding.AwayFromZero))
        'System.ArgumentOutOfRangeException: 
        '丸める桁数は 0 から 15 までの間でなければなりません。

    End Sub

End Module

 

 

コメント

タイトルとURLをコピーしました