.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」

TechTargetジャパン

Insider.NET フォーラム 新着記事
  • エンドユーザーの言語設定を取得するには? (2014/10/23)
     エンドユーザーの言語設定を取得する方法はいくつかある。それらの方法で得られるものは何か、どの方法を使えばよいのかを本稿では解説する
  • WPF:DataGridなどにデータをソートして表示する (2014/10/21)
     WPFアプリでDataGridコントロールやListViewコントロールに表示されるデータを、プログラムコードの側からソートして表示する方法を解説する
  • 第1回 Forguncyに触ってみよう (2014/10/15)
     「Excel方眼紙」の「方眼紙」をもじった名前で話題となったForguncyの正式版がリリース。Forguncy連載スタート
  • WPF:リボンUIを実装するには? (2014/10/14)
     Windowsエクスプローラーなど、最近ではリボンを使用したアプリをよく目にするようになった。リボンを持ったWPFアプリを構築する方法を解説する
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

キャリアアップ


- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る
- PR -

ホワイトペーパーTechTargetジャパン

ソリューションFLASH

「ITmedia マーケティング」新着記事

ターゲットの心を着実に動かす秘策とは?
ターゲットに情報を伝えるには、ターゲットのインサイトに基づいて、伝える情報範囲を吟...

第4回 購買データの新たな挑戦
マーケティング活動の基本指標となる購買データ。今回は既存のPOSデータや消費者スキャン...

アグレックス、コンテンツマネジメント分野でのれんと提携
ITホールディングスグループのアグレックスは10月23日、アシストグループののれんとコン...