丸め(四捨五入・銀行家の丸め)を行うには「Math.Round」を使用します。
「四捨五入」と「銀行家の丸め」の違い
「銀行家の丸め」は「四捨五入」と同じに見えますが、丸め対象の値が「5」の時、結果が偶数になります。 .NETの丸め処理は「Math.Round」メソッドで行いますが、デフォルトは「銀行家の丸め」なので注意してください。 次の表は「四捨五入」と「銀行家の丸め」の違いです。丸め対象が「5」の時、「銀行家の丸め」では結果が全て偶数になっています。値 | 四捨五入 | 銀行家の丸め | 値 | 四捨五入 | 銀行家の丸め | 値 | 四捨五入 | 銀行家の丸め | 値 | 四捨五入 | 銀行家の丸め |
---|---|---|---|---|---|---|---|---|---|---|---|
0.0 | 0 | 0 | 1.0 | 1 | 1 | 2.4 | 2 | 2 | 3.4 | 3 | 3 |
0.1 | 0 | 0 | 1.1 | 1 | 1 | 2.4 | 2 | 2 | 3.4 | 3 | 3 |
0.2 | 0 | 0 | 1.2 | 1 | 1 | 2.4 | 2 | 2 | 3.4 | 3 | 3 |
0.3 | 0 | 0 | 1.3 | 1 | 1 | 2.4 | 2 | 2 | 3.4 | 3 | 3 |
0.4 | 0 | 0 | 1.4 | 1 | 1 | 2.4 | 2 | 2 | 3.4 | 3 | 3 |
0.5 | 1 | 0 | 1.5 | 2 | 2 | 2.5 | 3 | 2 | 3.5 | 4 | 4 |
0.6 | 1 | 1 | 1.6 | 2 | 2 | 2.6 | 3 | 3 | 3.6 | 4 | 4 |
0.7 | 1 | 1 | 1.7 | 2 | 2 | 2.7 | 3 | 3 | 3.7 | 4 | 4 |
0.8 | 1 | 1 | 1.8 | 2 | 2 | 2.8 | 3 | 3 | 3.8 | 4 | 4 |
0.9 | 1 | 1 | 1.9 | 2 | 2 | 2.9 | 3 | 3 | 3.9 | 4 | 4 |
「四捨五入」と「銀行家の丸め」の方法
「四捨五入」をするには「Math.Round」メソッドのオプションで「MidpointRounding.AwayFromZero」を指定します。オプションを省略した場合と、「MidpointRounding.ToEven」を指定した場合は「銀行家の丸め」です。-
C#
// 四捨五入 double result21 = Math.Round(0.5, MidpointRounding.AwayFromZero); // 1 double result22 = Math.Round(1.5, MidpointRounding.AwayFromZero); // 2 double result23 = Math.Round(2.5, MidpointRounding.AwayFromZero); // 3 double result24 = Math.Round(3.5, MidpointRounding.AwayFromZero); // 4 // 小数部の桁数を指定した四捨五入 double result31 = Math.Round(0.05, 1, MidpointRounding.AwayFromZero); // 0.1 double result32 = Math.Round(0.15, 1, MidpointRounding.AwayFromZero); // 0.2 double result33 = Math.Round(0.25, 1, MidpointRounding.AwayFromZero); // 0.3 double result34 = Math.Round(0.35, 1, MidpointRounding.AwayFromZero); // 0.4 // 最近接偶数への丸め(銀行家の丸め・JIS丸め) double result01 = Math.Round(0.5); // 0 double result02 = Math.Round(1.5); // 2 double result03 = Math.Round(2.5); // 2 double result04 = Math.Round(3.5); // 4 // 小数部の桁数を指定した最近接偶数への丸め(銀行家の丸め・JIS丸め) double result11 = Math.Round(0.05, 1); // 0 double result12 = Math.Round(0.15, 1); // 0.2 double result13 = Math.Round(0.25, 1); // 0.2 double result14 = Math.Round(0.35, 1); // 0.4
-
VB.NET
' 四捨五入 Dim result21 As Double = Math.Round(0.5, MidpointRounding.AwayFromZero) ' 1 Dim result22 As Double = Math.Round(1.5, MidpointRounding.AwayFromZero) ' 2 Dim result23 As Double = Math.Round(2.5, MidpointRounding.AwayFromZero) ' 3 Dim result24 As Double = Math.Round(3.5, MidpointRounding.AwayFromZero) ' 4 ' 小数部の桁数を指定した四捨五入 Dim result31 As Double = Math.Round(0.05, 1, MidpointRounding.AwayFromZero) ' 0.1 Dim result32 As Double = Math.Round(0.15, 1, MidpointRounding.AwayFromZero) ' 0.2 Dim result33 As Double = Math.Round(0.25, 1, MidpointRounding.AwayFromZero) ' 0.3 Dim result34 As Double = Math.Round(0.35, 1, MidpointRounding.AwayFromZero) ' 0.4 ' 最近接偶数への丸め(銀行家の丸め・JIS丸め) Dim result01 As Double = Math.Round(0.5) ' 0 Dim result02 As Double = Math.Round(1.5) ' 2 Dim result03 As Double = Math.Round(2.5) ' 2 Dim result04 As Double = Math.Round(3.5) ' 4 ' 小数部の桁数を指定した最近接偶数への丸め(銀行家の丸め・JIS丸め) Dim result11 As Double = Math.Round(0.05, 1) ' 0 Dim result12 As Double = Math.Round(0.15, 1) ' 0.2 Dim result13 As Double = Math.Round(0.25, 1) ' 0.2 Dim result14 As Double = Math.Round(0.35, 1) ' 0.4
「銀行家の丸め」の特徴
「四捨五入」では 1~4(4種類)が切り捨てられ、5~9(5種類)が切り上げになるため、合計したときに値が大きくなる傾向にあります。「銀行家の丸め」では「5」のときに偶数と奇数で振り分けられるため、誤差は小さくなります。しかし万能ではないため、厳密な金額計算などでは端数を按分する等の配慮が必要です。「銀行家の丸め」の別名
記事内では「銀行家の丸め」としましたが、他にも「JIS丸め」「ISO丸め」「最近接偶数への丸め」「偶数丸め」「五捨五入」「偶捨奇入」とも呼ばれます。サンプルコードのダウンロード
サンプルコードの実行には Microsoft Visual Studio 2015 以上のバージョンが必要です。 2015以外のバージョンではプロジェクトを開いた際にファイルの変換が必要な場合があります。その場合は変換後に実行してください。検証環境
- Microsoft Visual Studio Professional 2015 Version 14.0.25431.01 Update 3
- Microsoft .NET Framework Version 4.6.01055
- Microsoft Windows 7 Professional Service Pack 1 (Microsoft Windows NT 6.1 (7601))