以前の記事「【VB.NET】小数部の端数処理」で端数処理について紹介しました。
この記事に記載されている四捨五入用のRoundメソッドについての補足です。

VB 2005からオーバーロード(※1)されたメソッドが追加されています。
追加されたオーバーロードには、MidpointRoundingという引数が追加されており、この引数を指定することで四捨五入の精度を高めています。
MidpointRoundingでは、指定した数値が中間に位置する場合の処理方法を指定できます。
MidpointRoundingは、System.MidpointRounding列挙型として用意されています。
以下、列挙子の説明です。
 ・AwayFromZero
  →数値が 2 つの数値の中間に位置するときに、ゼロから遠い方の近似値に丸められます。
 ・ToEven
  →数値が 2 つの数値の中間に位置するときに、最も近い偶数方向に丸められます。

以下、サンプル。
【コード】
Module Module1
Sub Main()
Dim result As Double
Dim position As Integer
position = 2
result = 12.5 / 100
Console.WriteLine("{0}", result)
Console.WriteLine("Round = {0}", System.Math.Round(result, position))
Console.WriteLine("AwayFromZero = {0}", _
System.Math.Round(result, position, System.MidpointRounding.AwayFromZero))
Console.WriteLine("ToEven = {0}", _
System.Math.Round(result, position, System.MidpointRounding.ToEven))
Console.ReadLine()
End Sub
End Module

【実行結果】
0.125
Round = 0.12
AwayFromZero = 0.13
ToEven = 0.13

※1 メソッド名が同じでありながら、引数の数やデータ型が異なるメソッドのこと。
  渡した引数の数とデータ型によって、実行するメソッドが変わります。
   ・Math.Round(Decimal)
   ・Math.Round(Double)
   ・Math.Round(Decimal, Int32)
   ・Math.Round(Double, Int32)
  上記は、全て同じメソッド名ですが、引数の数とデータ型が異なるため、オーバーロードされていることになります。

【補足事項】
・上記の差は、偶数丸め(JIS丸め)によるものです。
・偶数丸めとは、統計的な誤差が均一になる丸め方です。
 数値が2つの中間にいる場合は、偶数方向へ丸められます。
  例)1.5の場合は、2に丸められる。
    2.5の場合は、2に丸められる。
・偶数丸めは、四捨五入とは挙動が違います。

誤差については、以下のサイトが参考になります。
 ・誤差 - Wikipedia