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メソッドに加えて、Math.CeilingMath.Floorも含まれます。

〜へ 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 つの数値の間で正確に半分になります。 たとえば、3.47500 は小数点以下 2 桁に丸める場合は中間値、整数に丸める場合は 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 以降のバージョンでは、MidpointRounding 列挙型を通じて 3 つの丸め戦略を追加で使用できます。 これらの戦略は、 MidpointRounding.ToEvenMidpointRounding.AwayFromZero の中間値だけでなく、すべてのケースで使用されます。

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

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

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
open System

let values = [| 1.15m; 1.25m; 1.35m; 1.45m; 1.55m; 1.65m |]
let mutable sum = 0m

// Calculate true mean.
for value in values do
    sum <- sum + value

printfn $"True mean:     {sum / decimal values.Length:N2}"

// Calculate mean with rounding away from zero.
sum <- 0m
for value in values do
    sum <- sum + Math.Round(value, 1, MidpointRounding.AwayFromZero)

printfn $"AwayFromZero:  {sum / decimal values.Length:N2}"

// Calculate mean with rounding to nearest.
sum <- 0m
for value in values do
    sum <- sum + Math.Round(value, 1, MidpointRounding.ToEven)

printfn $"ToEven:        {sum / decimal values.Length:N2}"

// The example displays the following output:
//       True mean:     1.40
//       AwayFromZero:  1.45
//       ToEven:        1.40
Dim values() As Decimal = {1.15D, 1.25D, 1.35D, 1.45D, 1.55D, 1.65D}
Dim sum As Decimal

' Calculate true mean.
For Each value In values
    sum += value
Next
Console.WriteLine("True mean:     {0:N2}", sum / values.Length)

' Calculate mean with rounding away from zero.
sum = 0
For Each value In values
    sum += Math.Round(value, 1, MidpointRounding.AwayFromZero)
Next
Console.WriteLine("AwayFromZero:  {0:N2}", sum / values.Length)

' Calculate mean with rounding to nearest.
sum = 0
For Each value In values
    sum += Math.Round(value, 1, MidpointRounding.ToEven)
Next
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 メソッドのオーバーロードと、各メソッドが使用する丸め規則を示します。

Overload 丸め規則
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.499999999999999998 であることを示しています。 .499999999999998 は .5 未満であるため、中間値の丸め規則は発生せず、値は切り捨てられます。 この例でも示すように、定数値 11.5 を Double 変数に割り当てると、この問題は発生しません。

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
open System

let roundValueAndAdd (value: double) =
    printfn $"{value,5:N1} {value,20:R}  {Math.Round(value, MidpointRounding.ToEven),12} {Math.Round(value, MidpointRounding.AwayFromZero),15}"
    value + 0.1

printfn "%5s %20s  %12s %15s\n" "Value" "Full Precision" "ToEven" "AwayFromZero"
let mutable value = 11.1
for _ = 0 to 5 do
    value <- roundValueAndAdd value

printfn ""

value <- 11.5
roundValueAndAdd value
|> ignore

// 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
Public Sub Example()
    Dim value As Double = 11.1

    Console.WriteLine("{0,5} {1,20:R}  {2,12} {3,15}",
                    "Value", "Full Precision", "ToEven",
                    "AwayFromZero")
    Console.WriteLine()
    For ctr As Integer = 0 To 5
        value = RoundValueAndAdd(value)
    Next
    Console.WriteLine()

    value = 11.5
    RoundValueAndAdd(value)
End Sub

Private Function RoundValueAndAdd(value As Double) As Double
    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 + 0.1
End Function

' 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 つ以上の浮動小数点演算から計算される場合。
  • 丸める値がDoubleまたはDecimalではなくSingleである場合。 詳細については、次のセクション「 丸めと単精度浮動小数点値」を参照してください。

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

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

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

    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
    
    open System
    
    let roundApproximate dbl digits margin mode =
        let fraction = dbl * Math.Pow(10, digits)
        let value = Math.Truncate fraction
        let fraction = fraction - value
        if fraction = 0 then
            dbl
        else
            let tolerance = margin * dbl
            // Determine whether this is a midpoint value.
            if (fraction >= 0.5 - tolerance) && (fraction <= 0.5 + tolerance) then
                if mode = MidpointRounding.AwayFromZero then
                    (value + 1.) / Math.Pow(10, digits)
                elif value % 2. <> 0 then
                    (value + 1.) / Math.Pow(10, digits)
                else
                    value / Math.Pow(10, digits)
            // Any remaining fractional value greater than .5 is not a midpoint value.
            elif fraction > 0.5 then
                (value + 1.) / Math.Pow(10, digits)
            else
                value / Math.Pow(10, digits)
    
    
    let roundValueAndAdd value =
        let tolerance = 8e-14
        let round = roundApproximate value 0 tolerance
    
        printfn $"{value,5:N1} {value,20:R}  {round MidpointRounding.ToEven,12} {round MidpointRounding.AwayFromZero,15}"
        value + 0.1
    
    printfn "%5s %20s  %12s %15s\n" "Value" "Full Precision" "ToEven" "AwayFromZero"
    let mutable value = 11.1
    for _ = 0 to 5 do
        value <- roundValueAndAdd value
    
    printfn ""
    
    value <- 11.5
    roundValueAndAdd value 
    |> ignore
    
    // 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
    
    Public Sub Example()
        Dim value As Double = 11.1
    
        Console.WriteLine("{0,5} {1,20:R}  {2,12} {3,15}\n",
                        "Value", "Full Precision", "ToEven",
                        "AwayFromZero")
        For ctr As Integer = 0 To 5
            value = RoundValueAndAdd(value)
        Next
        Console.WriteLine()
    
        value = 11.5
        RoundValueAndAdd(value)
    End Sub
    
    Private Function RoundValueAndAdd(value As Double) As Double
        Const tolerance As Double = 0.00000000000008
        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 + 0.1
    End Function
    
    Private Function RoundApproximate(dbl As Double, digits As Integer, margin As Double,
                                     mode As MidpointRounding) As Double
        Dim fraction As Double = dbl * Math.Pow(10, digits)
        Dim value As Double = Math.Truncate(fraction)
        fraction = fraction - value
        If fraction = 0 Then Return dbl
    
        Dim tolerance As Double = margin * dbl
        ' Determine whether this is a midpoint value.
        If (fraction >= 0.5 - tolerance) And (fraction <= 0.5 + tolerance) Then
            If mode = MidpointRounding.AwayFromZero Then
                Return (value + 1) / Math.Pow(10, digits)
            Else
                If value Mod 2 <> 0 Then
                    Return (value + 1) / Math.Pow(10, digits)
                Else
                    Return value / Math.Pow(10, digits)
                End If
            End If
        End If
        ' Any remaining fractional value greater than .5 is not a midpoint value.
        If fraction > 0.5 Then
            Return (value + 1) / Math.Pow(10, digits)
        Else
            Return value / Math.Pow(10, digits)
        End If
    End Function
    
    ' 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 メソッドには、Decimal型とDouble型の引数を受け入れるオーバーロードが含まれています。 Single型の値を丸めるメソッドはありません。 Single 値を Round メソッドのいずれかのオーバーロードに渡すと、その値は (C# で) キャストされるか、(Visual Basicで) Doubleに変換され、Double パラメーターを持つ対応する Round オーバーロードが呼び出されます。 これは拡大変換ですが、次の例に示すように、精度の低下が伴うことがよくあります。 Single値 16.325 が Round メソッドに渡され、最も近い規則への丸めを使用して小数点以下 2 桁に丸められた場合、結果は 16.33 であり、16.32 の期待される結果ではありません。

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
// In F#, 'float', 'float64', and 'double' are aliases for System.Double...
// 'float32' and 'single' are aliases for System.Single
open System

let value = 16.325f
printfn $"Widening Conversion of {value:R} (type {value.GetType().Name}) to {double value:R} (type {(double value).GetType().Name}): "
printfn $"{Math.Round(decimal value, 2)}"
printfn $"{Math.Round(decimal value, 2, MidpointRounding.AwayFromZero)}"
printfn ""

let decValue = decimal value
printfn $"Cast of {value:R} (type {value.GetType().Name}) to {decValue} (type {decValue.GetType().Name}): "
printfn $"{Math.Round(decValue, 2)}"
printfn $"{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
Dim value As Single = 16.325
Console.WriteLine("Widening Conversion of {0:R} (type {1}) to {2:R} (type {3}): ",
                value, value.GetType().Name, CDbl(value),
                CDbl(value).GetType().Name)
Console.WriteLine(Math.Round(value, 2))
Console.WriteLine(Math.Round(value, 2, MidpointRounding.AwayFromZero))
Console.WriteLine()

Dim decValue As Decimal = CDec(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))
Console.WriteLine()

' 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 より大きいため、常に上に丸められます。

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

Round(Double, Int32, MidpointRounding)

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

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

public:
 static double Round(double value, int digits, MidpointRounding mode);
public static double Round(double value, int digits, MidpointRounding mode);
static member Round : double * int * MidpointRounding -> double
Public Shared Function Round (value As Double, digits As Integer, mode As MidpointRounding) As Double

パラメーター

value
Double

丸める倍精度浮動小数点数。

digits
Int32

戻り値の小数部の桁数。

mode
MidpointRounding

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

返品

valueが丸められる小数部digits数字を持つ数値。 valueの小数部の桁数がdigitsよりも少ない場合、valueは変更されずに返されます。

例外

digits が 0 より小さいか、15 より大きい。

mode は、 MidpointRoundingの有効な値ではありません。

注釈

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

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

Important

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

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

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


// 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)
// Round a positive and a negative value using the default.
let result = Math.Round(3.45, 1)
printfn $"{result,4} = Math.Round({3.45,5}, 1)"
let result = Math.Round(-3.45, 1)
printfn $"{result,4} = Math.Round({-3.45,5}, 1)\n"

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

// Round a negative value using a MidpointRounding value.
let result = Math.Round(-3.45, 1, MidpointRounding.ToEven)
printfn $"{result,4} = Math.Round({-3.45,5}, 1, MidpointRounding.ToEven)"
let result = Math.Round(-3.45, 1, MidpointRounding.AwayFromZero)
printfn $"{result,4} = Math.Round({-3.45,5}, 1, MidpointRounding.AwayFromZero)"
let result = Math.Round(-3.47, 1, MidpointRounding.ToZero)
printfn $"{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)
Dim posValue As Double = 3.45
Dim negValue As Double = -3.45

' Round a positive and a negative value using the default.  
Dim result As Double = Math.Round(posValue, 1)
Console.WriteLine("{0,4} = Math.Round({1,5}, 1)", result, posValue)
result = Math.Round(negValue, 1)
Console.WriteLine("{0,4} = Math.Round({1,5}, 1)", result, negValue)
Console.WriteLine()

' Round a positive value using a MidpointRounding value. 
result = Math.Round(posValue, 1, MidpointRounding.ToEven)
Console.WriteLine("{0,4} = Math.Round({1,5}, 1, MidpointRounding.ToEven)",
                   result, posValue)
result = Math.Round(posValue, 1, MidpointRounding.AwayFromZero)
Console.WriteLine("{0,4} = Math.Round({1,5}, 1, MidpointRounding.AwayFromZero)",
                   result, posValue)
Console.WriteLine()

' Round a positive value using a MidpointRounding value. 
result = Math.Round(negValue, 1, MidpointRounding.ToEven)
Console.WriteLine("{0,4} = Math.Round({1,5}, 1, MidpointRounding.ToEven)",
                    result, negValue)
result = Math.Round(negValue, 1, MidpointRounding.AwayFromZero)
Console.WriteLine("{0,4} = Math.Round({1,5}, 1, MidpointRounding.AwayFromZero)",
                   result, negValue)
Console.WriteLine()

'This code example produces the following results:

'  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.45, 1, MidpointRounding.ToEven)
' -3.5 = Math.Round(-3.45, 1, MidpointRounding.AwayFromZero)

注意 (呼び出し元)

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

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
open System

let values = [| 2.125; 2.135; 2.145; 3.125; 3.135; 3.145 |]
for value in values do
    printfn $"{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
Module Example
   Public Sub Main()
      Dim values() As Double = { 2.125, 2.135, 2.145, 3.125, 3.135, 3.145 }
      For Each value As Double In values
         Console.WriteLine("{0} --> {1}", value, 
                           Math.Round(value, 2, MidpointRounding.AwayFromZero))
      Next
   End Sub
End Module
' 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

こちらもご覧ください

適用対象

Round(Decimal, Int32, MidpointRounding)

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

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

public:
 static System::Decimal Round(System::Decimal d, int decimals, MidpointRounding mode);
public static decimal Round(decimal d, int decimals, MidpointRounding mode);
static member Round : decimal * int * MidpointRounding -> decimal
Public Shared Function Round (d As Decimal, decimals As Integer, mode As MidpointRounding) As Decimal

パラメーター

d
Decimal

丸める 10 進数。

decimals
Int32

戻り値の小数点以下の桁数。

mode
MidpointRounding

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

返品

丸められたddecimals小数部の数字を含む数値。 dの小数部の桁数がdecimalsよりも少ない場合、dは変更されずに返されます。

例外

decimals が 0 未満または 28 より大きい。

mode は、 MidpointRoundingの有効な値ではありません。

結果は、 Decimalの範囲外です。

注釈

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

Important

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

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

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

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)
*/
// Round a positive value using different strategies.
// The precision of the result is 1 decimal place.

let result = Math.Round(3.45m, 1, MidpointRounding.ToEven)
printfn $"{result} = Math.Round({3.45m}, 1, MidpointRounding.ToEven)"
let result = Math.Round(3.45m, 1, MidpointRounding.AwayFromZero)
printfn $"{result} = Math.Round({3.45m}, 1, MidpointRounding.AwayFromZero)"
let result = Math.Round(3.47m, 1, MidpointRounding.ToZero)
printfn $"{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.

let result = Math.Round(-3.45m, 1, MidpointRounding.ToEven)
printfn $"{result} = Math.Round({-3.45m}, 1, MidpointRounding.ToEven)"
let result = Math.Round(-3.45m, 1, MidpointRounding.AwayFromZero)
printfn $"{result} = Math.Round({-3.45m}, 1, MidpointRounding.AwayFromZero)"
let result = Math.Round(-3.47m, 1, MidpointRounding.ToZero)
printfn $"{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)
Dim result As Decimal = 0D
Dim posValue As Decimal = 3.45D
Dim negValue As Decimal = -3.45D

' Round a positive value using different strategies.
' The precision of the result is 1 decimal place.
result = Math.Round(posValue, 1, MidpointRounding.ToEven)
Console.WriteLine("{0,4} = Math.Round({1,5}, 1, MidpointRounding.ToEven)",
                   result, posValue)
result = Math.Round(posValue, 1, MidpointRounding.AwayFromZero)
Console.WriteLine("{0,4} = Math.Round({1,5}, 1, MidpointRounding.AwayFromZero)",
                   result, posValue)
result = Math.Round(posValue, 1, MidpointRounding.ToZero)
Console.WriteLine("{0,4} = Math.Round({1,5}, 1, MidpointRounding.ToZero)",
                   result, posValue)
Console.WriteLine()

' Round a negative value using different strategies.
' The precision of the result is 1 decimal place.
result = Math.Round(negValue, 1, MidpointRounding.ToEven)
Console.WriteLine("{0,4} = Math.Round({1,5}, 1, MidpointRounding.ToEven)",
                    result, negValue)
result = Math.Round(negValue, 1, MidpointRounding.AwayFromZero)
Console.WriteLine("{0,4} = Math.Round({1,5}, 1, MidpointRounding.AwayFromZero)",
                   result, negValue)
result = Math.Round(negValue, 1, MidpointRounding.ToZero)
Console.WriteLine("{0,4} = Math.Round({1,5}, 1, MidpointRounding.ToZero)",
                   result, negValue)
Console.WriteLine()

'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.45, 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.45, 1, MidpointRounding.ToZero)
'

こちらもご覧ください

適用対象

Round(Double, MidpointRounding)

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

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

public:
 static double Round(double value, MidpointRounding mode);
public static double Round(double value, MidpointRounding mode);
static member Round : double * MidpointRounding -> double
Public Shared Function Round (value As Double, mode As MidpointRounding) As Double

パラメーター

value
Double

丸める倍精度浮動小数点数。

mode
MidpointRounding

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

返品

丸められた value 整数。 このメソッドは、整数型ではなく Double を返します。

例外

mode は、 MidpointRoundingの有効な値ではありません。

注釈

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

Important

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

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

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

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
open System

let values = 
    [| 12.; 12.1; 12.2; 12.3; 12.4; 12.5
       12.6; 12.7; 12.8; 12.9; 13. |]

printfn "%-10s %-10s %-10s %-15s %-15s" "Value" "Default" "ToEven" "AwayFromZero" "ToZero"

for value in values do
    $"{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}"
    |> printfn "%s"
    
// 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
Dim values() As Double = {12.0, 12.1, 12.2, 12.3, 12.4, 12.5, 12.6,
                         12.7, 12.8, 12.9, 13.0}
Console.WriteLine("{0,-10} {1,-10} {2,-10} {3,-15} {4,-15}", "Value", "Default",
                "ToEven", "AwayFromZero", "ToZero")
For Each value In values
    Console.WriteLine("{0,-10} {1,-10} {2,-10} {3,-15} {4,-15}",
                   value, Math.Round(value),
                   Math.Round(value, MidpointRounding.ToEven),
                   Math.Round(value, MidpointRounding.AwayFromZero),
                   Math.Round(value, MidpointRounding.ToZero))
Next

' 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 が返されます。

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
open System

let roundValueAndAdd (value: float) =
      printfn $"{value} --> {Math.Round(value, MidpointRounding.AwayFromZero)}"
      value + 0.1

let mutable value = 11.1
for _ = 0 to 5 do
    value <- roundValueAndAdd value

printfn ""

value <- 11.5
roundValueAndAdd value
|> ignore

// 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
Module Example
   Public Sub Main()
      Dim value As Double = 11.1
      For ctr As Integer = 0 To 5    
         value = RoundValueAndAdd(value)
      Next
      Console.WriteLine()

      value = 11.5
      RoundValueAndAdd(value)
   End Sub
   
   Private Function RoundValueAndAdd(value As Double) As Double
      Console.WriteLine("{0} --> {1}", value, Math.Round(value, 
                        MidpointRounding.AwayFromZero))
      Return value + .1
   End Function   
End Module
' 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

こちらもご覧ください

適用対象

Round(Double, Int32)

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

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

public:
 static double Round(double value, int digits);
public static double Round(double value, int digits);
static member Round : double * int -> double
Public Shared Function Round (value As Double, digits As Integer) As Double

パラメーター

value
Double

丸める倍精度浮動小数点数。

digits
Int32

戻り値の小数部の桁数。

返品

digitsと等しい小数部の桁数を含む、valueに最も近い数値。

例外

digits が 0 より小さいか、15 より大きい。

注釈

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

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

Important

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

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

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

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
open System

printfn $"{Math.Round(3.44, 1)}" //Returns 3.4.
printfn $"{Math.Round(3.45, 1)}" //Returns 3.4.
printfn $"{Math.Round(3.46, 1)}" //Returns 3.5.

printfn $"{Math.Round(4.34, 1)}" // Returns 4.3
printfn $"{Math.Round(4.35, 1)}" // Returns 4.4
printfn $"{Math.Round(4.36, 1)}" // Returns 4.4
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 に丸められます。 これは、メソッドが内部的に 10valueを乗算し、この場合の乗算演算が精度の損失に苦しむためです。

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
open System

let values = [| 2.125; 2.135; 2.145; 3.125; 3.135; 3.145 |]
for value in values do
    printfn $"{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
Module Example
   Public Sub Main()
      Dim values() As Double = { 2.125, 2.135, 2.145, 3.125, 3.135, 3.145 }
      For Each value As Double In values
         Console.WriteLine("{0} --> {1}", value, Math.Round(value, 2))
      Next
   End Sub
End Module
' 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

こちらもご覧ください

適用対象

Round(Decimal, Int32)

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

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

public:
 static System::Decimal Round(System::Decimal d, int decimals);
public static decimal Round(decimal d, int decimals);
static member Round : decimal * int -> decimal
Public Shared Function Round (d As Decimal, decimals As Integer) As Decimal

パラメーター

d
Decimal

丸める 10 進数。

decimals
Int32

戻り値の小数点以下の桁数。

返品

decimalsと等しい小数部の桁数を含む、dに最も近い数値。

例外

decimals が 0 未満または 28 より大きい。

結果は、 Decimalの範囲外です。

注釈

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

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

Important

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

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

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
open System

printfn 
    $"""{Math.Round(3.44m, 1)}
{Math.Round(3.45m, 1)}
{Math.Round(3.46m, 1)}

{Math.Round(4.34m, 1)}
{Math.Round(4.35m, 1)}
{Math.Round(4.36m, 1)}"""

// The example displays the following output:
//       3.4
//       3.4
//       3.5
//
//       4.3
//       4.4
//       4.4
Console.WriteLine(Math.Round(3.44, 1))
Console.WriteLine(Math.Round(3.45, 1))
Console.WriteLine(Math.Round(3.46, 1))
Console.WriteLine()

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

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

こちらもご覧ください

適用対象

Round(Double)

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

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

public:
 static double Round(double a);
public static double Round(double a);
static member Round : double -> double
Public Shared Function Round (a As Double) As Double

パラメーター

a
Double

丸める倍精度浮動小数点数。

返品

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

注釈

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

Important

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

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

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

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

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

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
open System

printfn "Classic Math.Round in F#"
printfn $"{Math.Round(4.4)}" // 4
printfn $"{Math.Round(4.5)}" // 4
printfn $"{Math.Round(4.6)}" // 5
printfn $"{Math.Round(5.5)}" // 6
Module Module1

    Sub Main()
    Console.WriteLine("Classic Math.Round in Visual Basic")
    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
    End Sub

End Module

注意 (呼び出し元)

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

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
open System

let roundValueAndAdd (value: float) =
    printfn $"{value} --> {Math.Round value}"
    value + 0.1

let mutable value = 11.1

for _ = 0 to 5 do
    value <- roundValueAndAdd value

printfn ""

value <- 11.5
roundValueAndAdd value
|> ignore

// 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
Module Example
   Public Sub Main()
      Dim value As Double = 11.1
      For ctr As Integer = 0 To 5    
         value = RoundValueAndAdd(value)
      Next
      Console.WriteLine()

      value = 11.5
      RoundValueAndAdd(value)
   End Sub
   
   Private Function RoundValueAndAdd(value As Double) As Double
      Console.WriteLine("{0} --> {1}", value, Math.Round(value))
      Return value + .1
   End Function   
End Module
' 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

こちらもご覧ください

適用対象

Round(Decimal)

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

10 進値を最も近い整数値に丸め、中間値を最も近い偶数に丸めます。

public:
 static System::Decimal Round(System::Decimal d);
public static decimal Round(decimal d);
static member Round : decimal -> decimal
Public Shared Function Round (d As Decimal) As Decimal

パラメーター

d
Decimal

丸める 10 進数。

返品

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

例外

結果は、 Decimalの範囲外です。

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

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
open System

for value in 4.2m .. 0.1m .. 4.8m do
    printfn $"{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
Module Example
   Public Sub Main()
      For value As Decimal = 4.2d To 4.8d Step .1d
         Console.WriteLine("{0} --> {1}", value, Math.Round(value))
      Next   
   End Sub                                                                 
End Module
' 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の既定の丸め規則を使用します。 中間値を使用した数値の丸めについては、「 中間値と丸め規則」を参照してください。

Important

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

こちらもご覧ください

適用対象

Round(Decimal, MidpointRounding)

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

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

public:
 static System::Decimal Round(System::Decimal d, MidpointRounding mode);
public static decimal Round(decimal d, MidpointRounding mode);
static member Round : decimal * MidpointRounding -> decimal
Public Shared Function Round (d As Decimal, mode As MidpointRounding) As Decimal

パラメーター

d
Decimal

丸める 10 進数。

mode
MidpointRounding

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

返品

丸められた d 整数。 このメソッドは、整数型ではなく Decimal を返します。

例外

mode は、 MidpointRoundingの有効な値ではありません。

結果は、 Decimalの範囲外です。

注釈

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

Important

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

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

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
printfn $"""{"Value",-10} {"Default",-10} {"ToEven",-10} {"AwayFromZero",-15} {"ToZero",-15}"""
for value in 12m .. 0.1m .. 13m do
    printfn "%-10O %-10O %-10O %-15O %-15O" 
        value
        (Math.Round value)
        (Math.Round(value, MidpointRounding.ToEven))
        (Math.Round(value, MidpointRounding.AwayFromZero))
        (Math.Round(value, MidpointRounding.ToZero))

// 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
Console.WriteLine("{0,-10} {1,-10} {2,-10} {3,-15} {4,-15}", "Value", "Default",
                "ToEven", "AwayFromZero", "ToZero")
For value As Decimal = 12D To 13D Step 0.1D
    Console.WriteLine("{0,-10} {1,-10} {2,-10} {3,-15} {4,-15}",
                   value, Math.Round(value),
                   Math.Round(value, MidpointRounding.ToEven),
                   Math.Round(value, MidpointRounding.AwayFromZero),
                   Math.Round(value, MidpointRounding.ToZero))
Next

' 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.0       13         13         13               13

こちらもご覧ください

適用対象