英語で読む

次の方法で共有


Math.Round メソッド

定義

最も近い整数または指定した小数点以下の桁数に値を丸めます。

オーバーロード

Round(Double, Int32, MidpointRounding)

指定した丸め規則を使用して、倍精度浮動小数点値を指定した桁数の小数部に丸めます。

Round(Decimal, Int32, MidpointRounding)

指定した丸め規則を使用して、10 進数を指定した小数部の桁数に丸めます。

Round(Double, MidpointRounding)

指定した丸め規則を使用して、倍精度浮動小数点値を整数に丸めます。

Round(Double, Int32)

倍精度浮動小数点の値は指定した小数部の桁数に丸められ、中間値は最も近い偶数値に丸められます。

Round(Decimal, Int32)

10 進数の値は指定した小数部の桁数に丸められ、中間値は最も近い偶数値に丸められます。

Round(Double)

倍精度浮動小数点の値は最も近い整数値に丸められ、中間値は最も近い偶数値に丸められます。

Round(Decimal)

10 進数の値は最も近い整数値に丸められ、中間値は最も近い偶数値に丸められます。

Round(Decimal, MidpointRounding)

指定された丸め規則を使用して、10 進数の整数を丸めます。

この記事には、「 解説 」セクションの例に加えて、メソッドの次のオーバーロードを示す例が Math.Round 含まれています。

Math.Round(Decimal)Math.Round(Double)Math.Round(Decimal, Int32)Math.Round(Decimal, MidpointRounding)Math.Round(Double, Int32)Math.Round(Double, MidpointRounding)Math.Round(Decimal, Int32, MidpointRounding)Math.Round(Double, Int32, MidpointRounding)

注釈

このセクションの内容:

どのメソッドを呼び出しますか?

次の表を使用して、適切な丸め方法を選択できます。 メソッドにMath.Round加えて、 と Math.Floorも含まれますMath.Ceiling

終了 Call (英語の可能性あり)
最も近い四捨五入規則を使用して、数値を整数に丸めます。 Round(Decimal)
- または -
Round(Double)
指定した丸め規則を使用して、数値を整数に丸めます。 Round(Decimal, MidpointRounding)
- または -
Round(Double, MidpointRounding)
最も近い規則への丸めを使用して、指定した桁数の小数部に数値を丸めます。 Round(Decimal, Int32)
- または -
Round(Double, Int32)
指定した丸め規則を使用して、数値を指定した小数部の桁数に丸めます。 Round(Decimal, Int32, MidpointRounding)
- または -
Round(Double, Int32, MidpointRounding)
指定した丸め規則を Single 使用し、精度の損失を最小限に抑えて、指定した桁数の小数部に値を丸めます。 SingleDecimal 変換し、 を呼び出します Round(Decimal, Int32, MidpointRounding)
数値を指定した小数部の桁数に丸め、中間値の丸め精度の問題を最小限に抑えます。 "より大きいかほぼ等しい" 比較を実装する丸めメソッドを呼び出します。 「丸めと精度」を参照してください。
小数部の値を小数部の値より大きい整数に丸めます。 たとえば、3.1 から 4 の丸めなどです。 Ceiling
小数部の値を小数部の値より小さい整数に丸めます。 たとえば、3.9 から 3 に丸める場合です。 Floor

中間値と丸め規則

丸め処理では、指定した有効桁数の数値を、精度の低い値に変換します。 たとえば、 メソッドを Round(Double) 使用して値 3.4 を 3.0 に丸め、メソッドを Round(Double, Int32) 使用して値 3.579 を 3.58 に丸めることができます。

中間値では、結果の最下位桁の後の値は、2 つの数値の間の正確に半分になります。 たとえば、小数点以下 2 桁に丸める場合は 3.47500 は中点値、整数に丸める場合は 7.500 は中間値です。 このような場合、最も近い四捨五入戦略を使用する場合、丸め規則がないと、最も近い値を簡単に識別することはできません。

メソッドでは Round 、中間値を処理するための 2 つの丸め規則がサポートされています。

  • ゼロから丸める

    中間値は、0 から次の数値に丸められます。 たとえば、3.75 は 3.8 に、3.85 は 3.9 に、-3.75 は -3.8 に、-3.85 は -3.9 に丸めます。 この形式の丸めは、列挙メンバーによって MidpointRounding.AwayFromZero 表されます。

  • 最も近い偶数に丸める、または銀行家の丸め

    中間点の値は、最も近い偶数に丸められます。 たとえば、3.75 と 3.85 の両方が 3.8 に、-3.75 と -3.85 の両方が -3.8 に丸まるとします。 この形式の丸めは、列挙メンバーによって MidpointRounding.ToEven 表されます。

注意

.NET Core 3.0 以降のバージョンでは、 列挙を通じて 3 つの丸め方法を MidpointRounding 使用できます。 これらの戦略は、 と の中間値MidpointRounding.ToEvenMidpointRounding.AwayFromZeroだけでなく、すべてのケースで使用されます。

ゼロから丸めるのは最も広く知られている丸め形式ですが、最も近い偶数に丸めるのは財務および統計操作の標準です。 これは、IEEE Standard 754、セクション 4 に準拠しています。 複数の丸め操作で使用する場合、最も近い値に丸めると、中間値を 1 方向に一貫して丸めることで発生する丸めエラーが軽減されます。 場合によっては、この丸めエラーが大きくなる可能性があります。

次の例は、中間値を 1 方向に一貫して丸める結果として生じるバイアスを示しています。 この例では、値の配列の真の平均を計算し、配列内の Decimal 値が 2 つの規則を使用して丸められた場合に平均を計算します。 この例では、真の平均と、最も近い値に丸める場合の結果の平均は同じです。 ただし、ゼロから丸める場合の平均は、真の平均と .05 (または 3.6%) によって異なります。

C#
decimal[] values = { 1.15m, 1.25m, 1.35m, 1.45m, 1.55m, 1.65m };
decimal sum = 0;

// Calculate true mean.
foreach (var value in values)
    sum += value;

Console.WriteLine("True mean:     {0:N2}", sum / values.Length);

// Calculate mean with rounding away from zero.
sum = 0;
foreach (var value in values)
    sum += Math.Round(value, 1, MidpointRounding.AwayFromZero);

Console.WriteLine("AwayFromZero:  {0:N2}", sum / values.Length);

// Calculate mean with rounding to nearest.
sum = 0;
foreach (var value in values)
    sum += Math.Round(value, 1, MidpointRounding.ToEven);

Console.WriteLine("ToEven:        {0:N2}", sum / values.Length);

// The example displays the following output:
//       True mean:     1.40
//       AwayFromZero:  1.45
//       ToEven:        1.40

既定では、 メソッドは Round 最も近い偶数規則に丸めを使用します。 次の表に、 メソッドの Round オーバーロードと、それぞれが使用する丸め規則を示します。

オーバーロード 丸め規則
Round(Decimal) ToEven
Round(Double) ToEven
Round(Decimal, Int32) ToEven
Round(Double, Int32) ToEven
Round(Decimal, MidpointRounding) パラメーターによって決定されます mode
Round(Double, MidpointRounding) パラメーターによって決定されますmode
Round(Decimal, Int32, MidpointRounding) パラメーターによって決定されますmode
Round(Double, Int32, MidpointRounding) パラメーターによって決定されますmode

丸めと精度

丸め操作に中間値が含まれるかどうかを判断するために、 メソッドは元 Round の値を 10n で四捨五入します。ここで、 n は戻り値の小数部の目的の数を表し、値の残りの小数部が .5 以上かどうかを判断します。 これは等価性のテストに関するわずかなバリエーションであり、リファレンス トピックの「等値のテスト」セクション Double で説明されているように、浮動小数点形式のバイナリ表現と精度に関する問題により、浮動小数点値との等価性のテストは問題になります。 つまり、数値の小数部が .5 より少し小さい場合 (精度が低下するため) は、上に丸められません。

この問題を説明する例を次に示します。 .1 を 11.0 に繰り返し加算し、結果を最も近い整数に丸めます。 11.5 は、中間丸め規則 (ToEven または AwayFromZero) を使用して 12 に丸める必要があります。 ただし、この例の出力に示されているように、出力されません。 この例では、"R" 標準の数値書式指定文字列 を使用して浮動小数点値の完全な有効桁数を表示し、繰り返し加算すると丸められる値の精度が失われ、その値が実際には 11.4999999999999998 であることを示しています。 .499999999999998 は .5 未満であるため、中間四捨五入規則は発生せず、値は切り捨てられます。 この例でも示すように、定数値 11.5 Double を変数に割り当てると、この問題は発生しません。

C#
public static void Example()
{
    Console.WriteLine("{0,5} {1,20:R}  {2,12} {3,15}\n",
                      "Value", "Full Precision", "ToEven",
                      "AwayFromZero");
    double value = 11.1;
    for (int ctr = 0; ctr <= 5; ctr++)
        value = RoundValueAndAdd(value);

    Console.WriteLine();

    value = 11.5;
    RoundValueAndAdd(value);
}

private static double RoundValueAndAdd(double value)
{
    Console.WriteLine("{0,5:N1} {0,20:R}  {1,12} {2,15}",
                      value, Math.Round(value, MidpointRounding.ToEven),
                      Math.Round(value, MidpointRounding.AwayFromZero));
    return value + .1;
}

// The example displays the following output:
//       Value       Full Precision        ToEven    AwayFromZero
//
//        11.1                 11.1            11              11
//        11.2                 11.2            11              11
//        11.3   11.299999999999999            11              11
//        11.4   11.399999999999999            11              11
//        11.5   11.499999999999998            11              11
//        11.6   11.599999999999998            12              12
//
//        11.5                 11.5            12              12

中間値の丸め精度の問題は、次の条件で発生する可能性が最も高くなります。

  • 小数部の値を浮動小数点型のバイナリ形式で正確に表現できない場合。

  • 丸める値が 1 つ以上の浮動小数点演算から計算される場合。

  • 丸める値が または Decimalではなく Double であるSingle場合。 詳細については、次のセクション「 丸めと単精度浮動小数点値」を参照してください。

丸め操作の精度が不足している場合は、次の操作を実行できます。

  • 丸め操作で値を丸 Double めるオーバーロードを呼び出す場合は、 を Double 値に Decimal 変更し、代わりに値を丸めるオーバーロードを Decimal 呼び出すことができます。 Decimalデータ型にも精度の表現と損失の問題がありますが、これらの問題はあまり一般的ではありません。

  • "ほぼ等しい" テストを実行するカスタム丸めアルゴリズムを定義して、丸める値が中間値に許容範囲内に近いかどうかを判断します。 次の例では、 RoundApproximate 小数部の値が中間点の丸めの対象となる中間値に十分に近いかどうかを調べるメソッドを定義します。 例からの出力が示すように、前の例で示した丸め問題を修正します。

    C#
    public static void Example()
    {
        Console.WriteLine("{0,5} {1,20:R}  {2,12} {3,15}\n",
                          "Value", "Full Precision", "ToEven",
                          "AwayFromZero");
        double value = 11.1;
        for (int ctr = 0; ctr <= 5; ctr++)
            value = RoundValueAndAdd(value);
    
        Console.WriteLine();
    
        value = 11.5;
        RoundValueAndAdd(value);
    }
    
    private static double RoundValueAndAdd(double value)
    {
        const double tolerance = 8e-14;
    
        Console.WriteLine("{0,5:N1} {0,20:R}  {1,12} {2,15}",
                          value,
                          RoundApproximate(value, 0, tolerance, MidpointRounding.ToEven),
                          RoundApproximate(value, 0, tolerance, MidpointRounding.AwayFromZero));
        return value + .1;
    }
    
    private static double RoundApproximate(double dbl, int digits, double margin,
                                      MidpointRounding mode)
    {
        double fraction = dbl * Math.Pow(10, digits);
        double value = Math.Truncate(fraction);
        fraction = fraction - value;
        if (fraction == 0)
            return dbl;
    
        double tolerance = margin * dbl;
        // Determine whether this is a midpoint value.
        if ((fraction >= .5 - tolerance) & (fraction <= .5 + tolerance))
        {
            if (mode == MidpointRounding.AwayFromZero)
                return (value + 1) / Math.Pow(10, digits);
            else
               if (value % 2 != 0)
                return (value + 1) / Math.Pow(10, digits);
            else
                return value / Math.Pow(10, digits);
        }
        // Any remaining fractional value greater than .5 is not a midpoint value.
        if (fraction > .5)
            return (value + 1) / Math.Pow(10, digits);
        else
            return value / Math.Pow(10, digits);
    }
    
    // The example displays the following output:
    //       Value       Full Precision        ToEven    AwayFromZero
    //
    //        11.1                 11.1            11              11
    //        11.2                 11.2            11              11
    //        11.3   11.299999999999999            11              11
    //        11.4   11.399999999999999            11              11
    //        11.5   11.499999999999998            12              12
    //        11.6   11.599999999999998            12              12
    //
    //        11.5                 11.5            12              12
    

丸めと単精度浮動小数点値

メソッドには Round 、 型 DecimalDoubleの引数を受け入れるオーバーロードが含まれています。 型 Singleの値を丸めるメソッドはありません。 メソッドのいずれかのオーバーロードRoundに値を渡Singleすと、(C#では) キャストされるか、(Visual Basic では) にDouble変換され、 パラメーターを持つDouble対応するRoundオーバーロードが呼び出されます。 これは拡大変換ですが、次の例に示すように、精度の低下が伴うことがよくあります。 Single 16.325 の値が メソッドにRound渡され、最も近い規則への丸めを使用して小数点以下 2 桁に丸められた場合、結果は 16.33 であり、予想される 16.32 の結果ではありません。

C#
Single value = 16.325f;
Console.WriteLine("Widening Conversion of {0:R} (type {1}) to {2:R} (type {3}): ",
                  value, value.GetType().Name, (double)value,
                  ((double)(value)).GetType().Name);
Console.WriteLine(Math.Round(value, 2));
Console.WriteLine(Math.Round(value, 2, MidpointRounding.AwayFromZero));
Console.WriteLine();

Decimal decValue = (decimal)value;
Console.WriteLine("Cast of {0:R} (type {1}) to {2} (type {3}): ",
                  value, value.GetType().Name, decValue,
                  decValue.GetType().Name);
Console.WriteLine(Math.Round(decValue, 2));
Console.WriteLine(Math.Round(decValue, 2, MidpointRounding.AwayFromZero));

// The example displays the following output:
//    Widening Conversion of 16.325 (type Single) to 16.325000762939453 (type Double):
//    16.33
//    16.33
//
//    Cast of 16.325 (type Single) to 16.325 (type Decimal):
//    16.32
//    16.33

この予期しない結果は、値を に変換する際に精度が Single 失われることが原因です Double。 結果 Double の値 16.325000762939453 は中間値ではなく、16.325 より大きいため、常に上に丸められます。

多くの場合、例が示すように、値Decimalを にキャストまたは変換することで、精度の損失をSingle最小限に抑えたり、除去したりできます。 これは縮小変換であるため、キャスト演算子を使用するか、変換メソッドを呼び出す必要があることに注意してください。

Round(Double, Int32, MidpointRounding)

ソース:
Math.cs
ソース:
Math.cs
ソース:
Math.cs

指定した丸め規則を使用して、倍精度浮動小数点値を指定した桁数の小数部に丸めます。

C#
public static double Round (double value, int digits, MidpointRounding mode);

パラメーター

value
Double

丸め対象の倍精度浮動小数点数。

digits
Int32

戻り値の小数部の桁数。

mode
MidpointRounding

使用する丸め方法を指定する列挙値の 1 つ。

戻り値

丸められた小数部の桁数を持つdigitsvalue数値。 value の小数部の桁数が digits よりも少ない場合、value がそのまま返されます。

例外

digits が 0 より小さいか、15 を超えています。

modeMidpointRounding の正しい値ではありません。

注釈

引数の値の digits 範囲は 0 から 15 です。 型でサポートされる整数と小数部の桁数の Double 最大数は 15 です。

中間値を使用した数値の丸め処理の詳細については、「中間値と丸め規則」を参照してください。

重要

中間値を丸める際は、丸め処理アルゴリズムによって等値テストが実行されます。 浮動小数点形式での精度およびバイナリ表現における問題により、メソッドによって返される値が予測不可能な場合があります。 詳細については、「 丸めと精度」を参照してください。

引数の値が value の場合、メソッドは Double.NaNを返します Double.NaN。 が または の場合value、メソッドは、それぞれ または Double.NegativeInfinityを返Double.PositiveInfinityします。Double.NegativeInfinityDouble.PositiveInfinity

次の例では、 列挙型で メソッドを Round(Double, Int32, MidpointRounding) 使用する方法を MidpointRounding 示します。

C#

// Round a positive and a negative value using the default.
double result = Math.Round(3.45, 1);
Console.WriteLine($"{result,4} = Math.Round({3.45,5}, 1)");
result = Math.Round(-3.45, 1);
Console.WriteLine($"{result,4} = Math.Round({-3.45,5}, 1)\n");

// Round a positive value using a MidpointRounding value.
result = Math.Round(3.45, 1, MidpointRounding.ToEven);
Console.WriteLine($"{result,4} = Math.Round({3.45,5}, 1, MidpointRounding.ToEven)");
result = Math.Round(3.45, 1, MidpointRounding.AwayFromZero);
Console.WriteLine($"{result,4} = Math.Round({3.45,5}, 1, MidpointRounding.AwayFromZero)");
result = Math.Round(3.47, 1, MidpointRounding.ToZero);
Console.WriteLine($"{result,4} = Math.Round({3.47,5}, 1, MidpointRounding.ToZero)\n");

// Round a negative value using a MidpointRounding value.
result = Math.Round(-3.45, 1, MidpointRounding.ToEven);
Console.WriteLine($"{result,4} = Math.Round({-3.45,5}, 1, MidpointRounding.ToEven)");
result = Math.Round(-3.45, 1, MidpointRounding.AwayFromZero);
Console.WriteLine($"{result,4} = Math.Round({-3.45,5}, 1, MidpointRounding.AwayFromZero)");
result = Math.Round(-3.47, 1, MidpointRounding.ToZero);
Console.WriteLine($"{result,4} = Math.Round({-3.47,5}, 1, MidpointRounding.ToZero)\n");

// The example displays the following output:

//         3.4 = Math.Round( 3.45, 1)
//         -3.4 = Math.Round(-3.45, 1)

//         3.4 = Math.Round(3.45, 1, MidpointRounding.ToEven)
//         3.5 = Math.Round(3.45, 1, MidpointRounding.AwayFromZero)
//         3.4 = Math.Round(3.47, 1, MidpointRounding.ToZero)

//         -3.4 = Math.Round(-3.45, 1, MidpointRounding.ToEven)
//         -3.5 = Math.Round(-3.45, 1, MidpointRounding.AwayFromZero)
//         -3.4 = Math.Round(-3.47, 1, MidpointRounding.ToZero)

注意 (呼び出し元)

10 進値を浮動小数点数として表したり、浮動小数点値に対して算術演算を実行したりすると、精度が失われる可能性があるため、 パラメーターで Round(Double, Int32, MidpointRounding) 指定されているように mode メソッドが中間値を丸めないように見えることがあります。 次の例では、2.135 が 2.14 ではなく 2.13 に丸められます。 これは、内部的に メソッドが 10桁の乗算valueを行い、この場合の乗算演算が精度の低下に起因するためです。

C#
double[] values = { 2.125, 2.135, 2.145, 3.125, 3.135, 3.145 };
foreach (double value in values)
   Console.WriteLine("{0} --> {1}", value,
                     Math.Round(value, 2, MidpointRounding.AwayFromZero));

// The example displays the following output:
//       2.125 --> 2.13
//       2.135 --> 2.13
//       2.145 --> 2.15
//       3.125 --> 3.13
//       3.135 --> 3.14
//       3.145 --> 3.15

こちらもご覧ください

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Round(Decimal, Int32, MidpointRounding)

ソース:
Math.cs
ソース:
Math.cs
ソース:
Math.cs

指定した丸め規則を使用して、10 進数を指定した小数部の桁数に丸めます。

C#
public static decimal Round (decimal d, int decimals, MidpointRounding mode);

パラメーター

d
Decimal

丸め対象の 10 進数。

decimals
Int32

戻り値の小数部の桁数。

mode
MidpointRounding

使用する丸め方法を指定する列挙値の 1 つ。

戻り値

丸められた小数部の数字を含 decimalsd 数値。 d の小数部の桁数が decimals よりも少ない場合、d がそのまま返されます。

例外

decimals が 0 未満か、28 を超えています。

modeMidpointRounding の正しい値ではありません。

結果が Decimal の範囲外です。

注釈

中間値を使用した数値の丸め処理の詳細については、「中間値と丸め規則」を参照してください。

重要

中間値を丸める際は、丸め処理アルゴリズムによって等値テストが実行されます。 浮動小数点形式での精度およびバイナリ表現における問題により、メソッドによって返される値が予測不可能な場合があります。 詳細については、「 丸めと精度」を参照してください。

引数の値の decimals 範囲は 0 ~ 28 です。

次の例では、 列挙型で メソッドを Round 使用する方法を MidpointRounding 示します。

C#
decimal result;

// Round a positive value using different strategies.
// The precision of the result is 1 decimal place.

result = Math.Round(3.45m, 1, MidpointRounding.ToEven);
Console.WriteLine($"{result} = Math.Round({3.45m}, 1, MidpointRounding.ToEven)");
result = Math.Round(3.45m, 1, MidpointRounding.AwayFromZero);
Console.WriteLine($"{result} = Math.Round({3.45m}, 1, MidpointRounding.AwayFromZero)");
result = Math.Round(3.47m, 1, MidpointRounding.ToZero);
Console.WriteLine($"{result} = Math.Round({3.47m}, 1, MidpointRounding.ToZero)\n");

// Round a negative value using different strategies.
// The precision of the result is 1 decimal place.

result = Math.Round(-3.45m, 1, MidpointRounding.ToEven);
Console.WriteLine($"{result} = Math.Round({-3.45m}, 1, MidpointRounding.ToEven)");
result = Math.Round(-3.45m, 1, MidpointRounding.AwayFromZero);
Console.WriteLine($"{result} = Math.Round({-3.45m}, 1, MidpointRounding.AwayFromZero)");
result = Math.Round(-3.47m, 1, MidpointRounding.ToZero);
Console.WriteLine($"{result} = Math.Round({-3.47m}, 1, MidpointRounding.ToZero)\n");

/*
This code example produces the following results:

3.4 = Math.Round(3.45, 1, MidpointRounding.ToEven)
3.5 = Math.Round(3.45, 1, MidpointRounding.AwayFromZero)
3.4 = Math.Round(3.47, 1, MidpointRounding.ToZero)

-3.4 = Math.Round(-3.45, 1, MidpointRounding.ToEven)
-3.5 = Math.Round(-3.45, 1, MidpointRounding.AwayFromZero)
-3.4 = Math.Round(-3.47, 1, MidpointRounding.ToZero)
*/

こちらもご覧ください

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Round(Double, MidpointRounding)

ソース:
Math.cs
ソース:
Math.cs
ソース:
Math.cs

指定した丸め規則を使用して、倍精度浮動小数点値を整数に丸めます。

C#
public static double Round (double value, MidpointRounding mode);

パラメーター

value
Double

丸め対象の倍精度浮動小数点数。

mode
MidpointRounding

使用する丸め方法を指定する列挙値の 1 つ。

戻り値

四捨五入される value 整数。 このメソッドは、 Double 整数型の代わりに を返します。

例外

modeMidpointRounding の正しい値ではありません。

注釈

中間値を使用した数値の丸め処理の詳細については、「中間値と丸め規則」を参照してください。

重要

中間値を丸める際は、丸め処理アルゴリズムによって等値テストが実行されます。 浮動小数点形式での精度およびバイナリ表現における問題により、メソッドによって返される値が予測不可能な場合があります。 詳細については、「 丸めと精度」を参照してください。

引数の値が value の場合、メソッドは Double.NaNを返します Double.NaN。 が または の場合value、メソッドは、それぞれ または Double.NegativeInfinityを返Double.PositiveInfinityします。Double.NegativeInfinityDouble.PositiveInfinity

次の例では、 メソッドによって返される値が Round(Double, MidpointRounding) 異なる mode 値を表示します。

C#
Double[] values = { 12.0, 12.1, 12.2, 12.3, 12.4, 12.5, 12.6,
                  12.7, 12.8, 12.9, 13.0 };
Console.WriteLine($"{"Value",-10} {"Default",-10} {"ToEven",-10} {"AwayFromZero",-15} {"ToZero",-15}");

foreach (var value in values)
    Console.WriteLine($"{value,-10:R} {Math.Round(value),-10} " +
        $"{Math.Round(value, MidpointRounding.ToEven),-10} " +
        $"{Math.Round(value, MidpointRounding.AwayFromZero),-15} " +
        $"{Math.Round(value, MidpointRounding.ToZero),-15}");

// The example displays the following output:
//       Value      Default    ToEven     AwayFromZero    ToZero
//       12         12         12         12              12
//       12.1       12         12         12              12
//       12.2       12         12         12              12
//       12.3       12         12         12              12
//       12.4       12         12         12              12
//       12.5       12         12         13              12
//       12.6       13         13         13              12
//       12.7       13         13         13              12
//       12.8       13         13         13              12
//       12.9       13         13         13              12
//       13         13         13         13              13

注意 (呼び出し元)

小数点の値を浮動小数点数として表したり、浮動小数点値に対して算術演算を実行したりすると、精度が失われる可能性があるため、場合 Round(Double, MidpointRounding) によっては、メソッドが中間値を最も近い偶数の整数に丸めないように見えることがあります。 次の例では、浮動小数点値 .1 には有限のバイナリ表現がないため、値が 11.5 のメソッドの Round(Double) 最初の呼び出しでは、12 ではなく 11 が返されます。

C#
using System;

public class Example
{
   public static void Main()
   {
      double value = 11.1;
      for (int ctr = 0; ctr <= 5; ctr++)
         value = RoundValueAndAdd(value);

      Console.WriteLine();

      value = 11.5;
      RoundValueAndAdd(value);
   }

   private static double RoundValueAndAdd(double value)
   {
      Console.WriteLine("{0} --> {1}", value, Math.Round(value,
                        MidpointRounding.AwayFromZero));
      return value + .1;
   }
}
// The example displays the following output:
//       11.1 --> 11
//       11.2 --> 11
//       11.3 --> 11
//       11.4 --> 11
//       11.5 --> 11
//       11.6 --> 12
//
//       11.5 --> 12

こちらもご覧ください

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Round(Double, Int32)

ソース:
Math.cs
ソース:
Math.cs
ソース:
Math.cs

倍精度浮動小数点の値は指定した小数部の桁数に丸められ、中間値は最も近い偶数値に丸められます。

C#
public static double Round (double value, int digits);

パラメーター

value
Double

丸め対象の倍精度浮動小数点数。

digits
Int32

戻り値の小数部の桁数。

戻り値

value に等しい小数部の桁数を格納する digits に最も近い数値。

例外

digits が 0 より小さいか、15 を超えています。

注釈

引数の値の digits 範囲は 0 から 15 です。 型でサポートされる整数と小数部の桁数の Double 最大数は 15 です。

このメソッドは、 の既定の丸め規則 MidpointRounding.ToEvenを使用します。 中間値を使用した数値の丸め処理の詳細については、「中間値と丸め規則」を参照してください。

重要

中間値を丸める際は、丸め処理アルゴリズムによって等値テストが実行されます。 浮動小数点形式での精度およびバイナリ表現における問題により、メソッドによって返される値が予測不可能な場合があります。 詳細については、「 丸めと精度」を参照してください。

引数の値が value の場合、メソッドは Double.NaNを返します Double.NaN。 が または の場合value、メソッドは、それぞれ または Double.NegativeInfinityを返Double.PositiveInfinityします。Double.NegativeInfinityDouble.PositiveInfinity

次の例では、2 桁の小数部を持つ double 値を 1 桁の小数部を持つ double に丸めます。

C#
Math.Round(3.44, 1); //Returns 3.4.
Math.Round(3.45, 1); //Returns 3.4.
Math.Round(3.46, 1); //Returns 3.5.

Math.Round(4.34, 1); // Returns 4.3
Math.Round(4.35, 1); // Returns 4.4
Math.Round(4.36, 1); // Returns 4.4

注意 (呼び出し元)

小数点の値を浮動小数点数として表したり、浮動小数点値に対して算術演算を実行したりすると、精度が失われる可能性があるため、場合 Round(Double, Int32) によっては、メソッドが中点の値を小数点以下の最も近い偶数の値 digits に丸めないように見えることがあります。 次の例では、2.135 が 2.14 ではなく 2.13 に丸められます。 これは、内部的に メソッドが 10桁の乗算valueを行い、この場合の乗算演算が精度の低下に起因するためです。

C#
using System;

public class Example
{
   public static void Main()
   {
      double[] values = { 2.125, 2.135, 2.145, 3.125, 3.135, 3.145 };
      foreach (double value in values)
         Console.WriteLine("{0} --> {1}", value, Math.Round(value, 2));
   }
}
// The example displays the following output:
//       2.125 --> 2.12
//       2.135 --> 2.13
//       2.145 --> 2.14
//       3.125 --> 3.12
//       3.135 --> 3.14
//       3.145 --> 3.14

こちらもご覧ください

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Round(Decimal, Int32)

ソース:
Math.cs
ソース:
Math.cs
ソース:
Math.cs

10 進数の値は指定した小数部の桁数に丸められ、中間値は最も近い偶数値に丸められます。

C#
public static decimal Round (decimal d, int decimals);

パラメーター

d
Decimal

丸め対象の 10 進数。

decimals
Int32

戻り値の小数部の桁数。

戻り値

d に等しい小数部の桁数を格納する decimals に最も近い数値。

例外

decimals が 0 未満か、28 を超えています。

結果が Decimal の範囲外です。

注釈

引数の値の decimals 範囲は 0 ~ 28 です。

このメソッドは、 の既定の丸め規則 MidpointRounding.ToEvenを使用します。 中点の値を含む数値の丸めについては、「 中間値と丸め規則」を参照してください。

重要

中間値を丸める際は、丸め処理アルゴリズムによって等値テストが実行されます。 浮動小数点形式での精度およびバイナリ表現における問題により、メソッドによって返される値が予測不可能な場合があります。 詳細については、「 丸めと精度」を参照してください。

次の例では、2 桁の小数部を持つ 10 進値を 1 桁の小数部を持つ値に丸めます。

C#
Console.WriteLine(Math.Round(3.44m, 1));
Console.WriteLine(Math.Round(3.45m, 1));
Console.WriteLine(Math.Round(3.46m, 1));
Console.WriteLine();

Console.WriteLine(Math.Round(4.34m, 1));
Console.WriteLine(Math.Round(4.35m, 1));
Console.WriteLine(Math.Round(4.36m, 1));

// The example displays the following output:
//       3.4
//       3.4
//       3.5
//
//       4.3
//       4.4
//       4.4

こちらもご覧ください

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Round(Double)

ソース:
Math.cs
ソース:
Math.cs
ソース:
Math.cs

倍精度浮動小数点の値は最も近い整数値に丸められ、中間値は最も近い偶数値に丸められます。

C#
public static double Round (double a);

パラメーター

a
Double

丸め対象の倍精度浮動小数点数。

戻り値

a に最も近い整数。 a の小数部が 2 つの整数 (一方が偶数で、もう一方が奇数) の中間にある場合は、偶数が返されます。 このメソッドは、整数型ではなく Double を返します。

注釈

このメソッドは、 の既定の丸め規則 MidpointRounding.ToEvenを使用します。 中点の値を含む数値の丸めについては、「 中間値と丸め規則」を参照してください。

重要

中間値を丸める際は、丸め処理アルゴリズムによって等値テストが実行されます。 浮動小数点形式での精度およびバイナリ表現における問題により、メソッドによって返される値が予測不可能な場合があります。 詳細については、「 丸めと精度」を参照してください。

引数の値が a の場合、メソッドは Double.NaNを返します Double.NaN。 が または の場合a、メソッドは、それぞれ または Double.NegativeInfinityを返Double.PositiveInfinityします。Double.NegativeInfinityDouble.PositiveInfinity

Visual Basic 15.8 以降では、メソッドによって Round 返された値を 整数変換関数のいずれかに渡す場合、または によって返される Round Double 値が Option Strict が Off に設定された整数に自動的に変換される場合、Double から整数への変換のパフォーマンスが最適化されます。 この最適化によって、コードをより速く実行できます。大きい数値の整数型への変換を行うコードでは、最大で 2 倍速くなります。 次の例は、このような最適化された変換を示しています。

VB
Dim d1 As Double = 1043.75133
Dim i1 As Integer = CInt(Math.Ceiling(d1))        ' Result: 1044

Dim d2 As Double = 7968.4136
Dim i2 As Integer = CInt(Math.Ceiling(d2))        ' Result: 7968

次の例では、最も近い整数値に丸める方法を示します。

C#
Console.WriteLine("Classic Math.Round in CSharp");
Console.WriteLine(Math.Round(4.4)); // 4
Console.WriteLine(Math.Round(4.5)); // 4
Console.WriteLine(Math.Round(4.6)); // 5
Console.WriteLine(Math.Round(5.5)); // 6

注意 (呼び出し元)

小数点の値を浮動小数点数として表したり、浮動小数点値に対して算術演算を実行したりすると、精度が失われる可能性があるため、場合 Round(Double) によっては、メソッドが中間値を最も近い偶数の整数に丸めないように見えることがあります。 次の例では、浮動小数点値 .1 には有限のバイナリ表現がないため、値が 11.5 のメソッドの Round(Double) 最初の呼び出しでは、12 ではなく 11 が返されます。

C#
using System;

public class Example
{
   public static void Main()
   {
      double value = 11.1;
      for (int ctr = 0; ctr <= 5; ctr++)
         value = RoundValueAndAdd(value);

      Console.WriteLine();

      value = 11.5;
      RoundValueAndAdd(value);
   }

   private static double RoundValueAndAdd(double value)
   {
      Console.WriteLine("{0} --> {1}", value, Math.Round(value));
      return value + .1;
   }
}
// The example displays the following output:
//       11.1 --> 11
//       11.2 --> 11
//       11.3 --> 11
//       11.4 --> 11
//       11.5 --> 11
//       11.6 --> 12
//
//       11.5 --> 12

こちらもご覧ください

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Round(Decimal)

ソース:
Math.cs
ソース:
Math.cs
ソース:
Math.cs

10 進数の値は最も近い整数値に丸められ、中間値は最も近い偶数値に丸められます。

C#
public static decimal Round (decimal d);

パラメーター

d
Decimal

丸め対象の 10 進数。

戻り値

d パラメーターに最も近い整数。 d の小数部が 2 つの整数 (一方が偶数で、もう一方が奇数) の中間にある場合は、偶数が返されます。 このメソッドは、整数型ではなく Decimal を返します。

例外

結果が Decimal の範囲外です。

Round(Decimal)メソッドの例を次に示します。 このオーバーロードでは既定ToEvenの規則が使用されるため、値 4.5 は Decimal 5 ではなく 4 に丸めます。

C#
for (decimal value = 4.2m; value <= 4.8m; value+=.1m )
   Console.WriteLine("{0} --> {1}", value, Math.Round(value));
// The example displays the following output:
//       4.2 --> 4
//       4.3 --> 4
//       4.4 --> 4
//       4.5 --> 4
//       4.6 --> 5
//       4.7 --> 5
//       4.8 --> 5

注釈

このメソッドは、 の既定の丸め規則 MidpointRounding.ToEvenを使用します。 中点の値を含む数値の丸めについては、「 中間値と丸め規則」を参照してください。

重要

中間値を丸める際は、丸め処理アルゴリズムによって等値テストが実行されます。 浮動小数点形式での精度およびバイナリ表現における問題により、メソッドによって返される値が予測不可能な場合があります。 詳細については、「 丸めと精度」を参照してください。

こちらもご覧ください

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Round(Decimal, MidpointRounding)

ソース:
Math.cs
ソース:
Math.cs
ソース:
Math.cs

指定された丸め規則を使用して、10 進数の整数を丸めます。

C#
public static decimal Round (decimal d, MidpointRounding mode);

パラメーター

d
Decimal

丸め対象の 10 進数。

mode
MidpointRounding

使用する丸め方法を指定する列挙値の 1 つ。

戻り値

四捨五入される d 整数。 このメソッドは、 Decimal 整数型の代わりに を返します。

例外

modeMidpointRounding の正しい値ではありません。

結果が Decimal の範囲外です。

注釈

中点の値を含む数値の丸めについては、「 中間値と丸め規則」を参照してください。

重要

中間値を丸める際は、丸め処理アルゴリズムによって等値テストが実行されます。 浮動小数点形式での精度およびバイナリ表現における問題により、メソッドによって返される値が予測不可能な場合があります。 詳細については、「 丸めと精度」を参照してください。

次の例では、 メソッドによって返される値が Round(Decimal, MidpointRounding) 異なる mode 値を表示します。

C#
Console.WriteLine($"{"Value",-10} {"Default",-10} {"ToEven",-10} {"AwayFromZero",-15} {"ToZero",-15}");
for (decimal value = 12.0m; value <= 13.0m; value += 0.1m)
    Console.WriteLine($"{value,-10} {Math.Round(value),-10} " +
        $"{Math.Round(value, MidpointRounding.ToEven),-10} " +
        $"{Math.Round(value, MidpointRounding.AwayFromZero),-15} " +
        $"{Math.Round(value, MidpointRounding.ToZero),-15}");

// The example displays the following output:
//       Value      Default    ToEven     AwayFromZero    ToZero
//       12.0       12         12         12              12
//       12.1       12         12         12              12
//       12.2       12         12         12              12
//       12.3       12         12         12              12
//       12.4       12         12         12              12
//       12.5       12         12         13              12
//       12.6       13         13         13              12
//       12.7       13         13         13              12
//       12.8       13         13         13              12
//       12.9       13         13         13              12
//       13.0       13         13         13              13

こちらもご覧ください

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0