.NET TIPS

数値を四捨五入するには?[2.0のみ、C#、VB]

デジタルアドバンテージ 一色 政彦
2008/01/31

 数値を四捨五入するには、Mathクラス(System名前空間)の静的メソッドRoundを使う(.NET Framework 2.0のみ)。

 なお、.NET Framework 1.xの時代からMath.Roundメソッドは提供されていたが、このメソッドは日本ではあまりなじみのない「最近接偶数への丸め」にしか対応していなかった。「最近接偶数への丸め」とは、(切り捨てや切り上げなどの)丸めを行う端数部分の数値がちょうど上と下の値の中間にある場合(例えば「2」と「3」のちょうど中間の値の「2.5」のような場合)に、最も近い偶数に数値を丸める端数処理のことだ。例えば「2.5」の小数点第1位を「四捨五入」した場合「3」になるが、「最近接偶数への丸め」を行った場合、最も近い偶数の「2」になる(ちなみに「2.51」の場合は両方とも「3になる」)。一般的に「四捨五入」よりも「最近接偶数への丸め」の方が、端数処理を累積したときの誤差が小さくなる。そのため、銀行家が好んで利用したので「Bankers Rounding(銀行家の丸め)」とも呼ばれている。

 .NET Framework 2.0以降では、日本では一般的な、4以下を切り捨て5以上を切り上げる「四捨五入」に対応している。本稿ではこれを利用する方法を紹介する。

 そのMath.Roundメソッドのシグネチャは次のとおりだ。

Math.Round (Decimal, Int32, MidpointRounding)

 第1パラメータには四捨五入を行うDecimal型の数値を指定する。

 第2パラメータには小数点第何位までを求めるか(=小数点以下のけた数)を指定する。例えば小数点第1位までを求める場合(=小数点第2位を四捨五入する)には、「1」を指定すればよい。

 第3パラメータには「MidpointRounding.AwayFromZero」を指定する。これはMidpointRounding列挙体(System名前空間)のAwayFromZeroという値で、「四捨五入」を行うためのものだ。このほか「最近接偶数への丸め」を行うための「MidpointRounding.ToEven」も指定できる。

 戻り値は、四捨五入された(もしくは最近接偶数へ丸められた)Decimal型の数値となる。

 次のコードはMath.Roundメソッドを使用したコンソール・アプリケーションのサンプル・プログラムである。このプログラムでは前半で「四捨五入」を行い、参考までに後半では「最近接偶数への丸め」を行っている。

using System;

class Program
{
  static void Main(string[] args)
  {
    // 以下では小数点第2位で「四捨五入」を行う
    Console.WriteLine("四捨五入");
    const MidpointRounding away = MidpointRounding.AwayFromZero;

    decimal AwayFromZero105 = Math.Round(1.05m, 1, away);
    Console.WriteLine(AwayFromZero105); // 出力:1.1

    decimal AwayFromZero115 = Math.Round(1.15m, 1, away);
    Console.WriteLine(AwayFromZero115); // 出力:1.2

    decimal AwayFromZero125 = Math.Round(1.25m, 1, away);
    Console.WriteLine(AwayFromZero125); // 出力:1.3

    decimal AwayFromZero135 = Math.Round(1.35m, 1, away);
    Console.WriteLine(AwayFromZero135); // 出力:1.4


    // 以下では小数点第2位で「最近接偶数への丸め」を行う
    Console.WriteLine("最近接偶数への丸め");
    const MidpointRounding even = MidpointRounding.ToEven;

    decimal NearestEven105 = Math.Round(1.05m, 1, even);
    Console.WriteLine(NearestEven105); // 出力:1.0

    decimal NearestEven115 = Math.Round(1.15m, 1, even);
    Console.WriteLine(NearestEven115); // 出力:1.2

    decimal NearestEven125 = Math.Round(1.25m, 1, even);
    Console.WriteLine(NearestEven125); // 出力:1.2

    decimal NearestEven135 = Math.Round(1.35m, 1, even);
    Console.WriteLine(NearestEven135); // 出力:1.4
  }
}
Module Module1

  Sub Main()
    ' 以下では小数点第2位で「四捨五入」を行う
    Console.WriteLine("四捨五入")
    Const away As MidpointRounding = MidpointRounding.AwayFromZero

    Dim AwayFromZero105 As Decimal = Math.Round(1.05D, 1, away)
    Console.WriteLine(AwayFromZero105) ' 出力:1.1

    Dim AwayFromZero115 As Decimal = Math.Round(1.15D, 1, away)
    Console.WriteLine(AwayFromZero115) ' 出力:1.2

    Dim AwayFromZero125 As Decimal = Math.Round(1.25D, 1, away)
    Console.WriteLine(AwayFromZero125) ' 出力:1.3

    Dim AwayFromZero135 As Decimal = Math.Round(1.35D, 1, away)
    Console.WriteLine(AwayFromZero135) ' 出力:1.4


    ' 以下では小数点第2位で「最近接偶数への丸め」を行う
    Console.WriteLine("最近接偶数への丸め")
    Const even As MidpointRounding = MidpointRounding.ToEven

    Dim NearestEven105 As Decimal = Math.Round(1.05D, 1, even)
    Console.WriteLine(NearestEven105) ' 出力:1.0

    Dim NearestEven115 As Decimal = Math.Round(1.15D, 1, even)
    Console.WriteLine(NearestEven115) ' 出力:1.2

    Dim NearestEven125 As Decimal = Math.Round(1.25D, 1, even)
    Console.WriteLine(NearestEven125) ' 出力:1.2

    Dim NearestEven135 As Decimal = Math.Round(1.35D, 1, even)
    Console.WriteLine(NearestEven135) ' 出力:1.4
  End Sub

End Module
数値の四捨五入を行うサンプル・プログラム(上:C#、下:VB)

 「MidpointRounding.AwayFromZero」や「MidpointRounding.ToEven」の記述は長いので、見やすくするためにこれらをシンプルな変数(awayとeven)に置き換えているので注意してほしい。

 パラメータに指定した数値の後ろに付いているサフィックス(C#の「m」や、VBの「D」「F」)は、数値のデータ型を明示するためのものだ。詳しくは「TIPS:数値のデータ型を明示的に指定するには?」を参照してほしい。End of Article

カテゴリ:クラス・ライブラリ 処理対象:数値関数
使用ライブラリ:Mathクラス(System名前空間)
使用ライブラリ:Int32構造体(System名前空間)
使用ライブラリ:Decimal構造体(System名前空間)
関連TIPS:数値のデータ型を明示的に指定するには?

この記事と関連性の高い別の.NET TIPS
数値の切り捨て/切り上げを行うには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間