LoginSignup
8
6

More than 5 years have passed since last update.

Math.Round(銀行丸め)ではなく四捨五入をしたい

Posted at

この歳まで知らなかったので、忘れぬようメモ。

Roundは四捨五入ではない(銀行丸め)

Math.Round()って今まで四捨五入かと思っていたのですが、
厳密に言うと「銀行丸め」と言って、偶数寄りに丸められてしまいます。
(参考:Wikipedia端数処理)

Math.Round(1.5) = 2
Math.Round(4.5) = 4 (5ではない)

四捨五入するには

そこで、
小数点第1位で四捨五入したい場合には、「0.5 を足して小数部を切り捨て」します。
小数点第2位で四捨五入したい場合には、「10倍して0.5 を足して小数部を切り捨てて10で割り」ます。

サンプル ソースコード

sisyagonyuu.vb
    ''' <summary>
    ''' 四捨五入する
    ''' </summary>
    ''' <param name="value">四捨五入する値値</param>
    ''' <param name="digit">小数点第何位で四捨五入するか(初期値=1)</param>
    ''' <returns>四捨五入した値</returns>
    ''' <remarks></remarks>
    Public Function Sisyagonyuu(ByVal value As Double, Optional ByVal digit As Integer = 1) As Integer
        Dim unit As Integer = 10 ^ (digit - 1)

        If value >= 0 Then
            Sisyagonyuu = Math.Floor(value * unit + 0.5) / unit
        Else
            Sisyagonyuu = Math.Ceiling(value * unit - 0.5) / unit
        End If
    End Function

    Sub Main()
        Console.WriteLine("Sisyagonyuu(1.49)=" + CStr(Sisyagonyuu(1.49)))
        Console.WriteLine("Sisyagonyuu(1.5)=" + CStr(Sisyagonyuu(1.5)))
        Console.WriteLine("Sisyagonyuu(4.49)=" + CStr(Sisyagonyuu(4.49)))
        Console.WriteLine("Sisyagonyuu(4.5)=" + CStr(Sisyagonyuu(4.5)))
    End Sub

実行結果

Sisyagonyuu(1.49)=1
Sisyagonyuu(1.5)=2
Sisyagonyuu(4.49)=4
Sisyagonyuu(4.5)=5

8
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6