この歳まで知らなかったので、忘れぬようメモ。
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