Math.Round Método

Definição

Arredonda um valor para o número inteiro mais próximo ou para o número especificado de dígitos fracionários.

Sobrecargas

Name Description
Round(Double, Int32, MidpointRounding)

Arredonda um valor de ponto flutuante de dupla precisão para um número especificado de dígitos fracionários usando a convenção de arredondamento especificada.

Round(Decimal, Int32, MidpointRounding)

Arredonda um valor decimal para um número especificado de dígitos fracionários usando a convenção de arredondamento especificada.

Round(Double, MidpointRounding)

Arredonda um valor de ponto flutuante de dupla precisão para um inteiro usando a convenção de arredondamento especificada.

Round(Double, Int32)

Arredonda um valor de ponto flutuante de precisão dupla para um número especificado de dígitos fracionários, e arredonda valores do ponto médio para o número par mais próximo.

Round(Decimal, Int32)

Arredonda um valor decimal para um número especificado de dígitos fracionários, e arredonda valores do ponto médio para o número par mais próximo.

Round(Double)

Arredonda um valor de ponto flutuante de dupla precisão ao valor integral mais próximo, e arredonda valores do ponto médio ao número par mais próximo.

Round(Decimal)

Arredonda um valor decimal para o valor integral mais próximo e arredonda valores do ponto médio para o número par mais próximo.

Round(Decimal, MidpointRounding)

Arredonda um valor decimal um inteiro usando a convenção de arredondamento especificada.

Exemplos

Para além dos exemplos na secção de Observações , este artigo inclui exemplos que ilustram as seguintes sobrecargas do Math.Round método:

Ronda.Matemática(Decimal)Ronda.Matemática(Duplo)Ronda.Matemática(Decimal, Int32)Ronda.Matemática(Decimal, Arredondamento Médio)Ronda.Matemática(Duplo, Int32)Ronda.Matemática(Duplo, Arredondamento Médio)Ronda.Matemática(Decimal, Int32, Arredondamento Médio)Ronda.Matemática(Duplo, Int32, Arredondamento Médio)

Observações

Nesta secção:

Que método devo chamar?

Pode usar a tabela seguinte para selecionar um método de arredondamento apropriado. Para além dos Math.Round métodos, inclui Math.Ceiling também e Math.Floor.

Para Call
Arredonda um número para um inteiro usando a convenção de arredondar para o mais próximo. Round(Decimal)
-ou-
Round(Double)
Arredonda um número para um inteiro usando uma convenção de arredondamento especificada. Round(Decimal, MidpointRounding)
-ou-
Round(Double, MidpointRounding)
Arredonda um número para um número especificado de dígitos fracionários usando o arredondamento para a convenção mais próxima. Round(Decimal, Int32)
-ou-
Round(Double, Int32)
Arredonda um número para um número especificado de dígitos fracionários usando uma convenção de arredondamento especificada. Round(Decimal, Int32, MidpointRounding)
-ou-
Round(Double, Int32, MidpointRounding)
Arredondar um Single valor para um número especificado de dígitos fracionários usando uma convenção de arredondamento especificada e minimizando a perda de precisão. Converter o Single para a Decimal e chamar Round(Decimal, Int32, MidpointRounding).
Arredondar um número para um número especificado de dígitos fracionários, minimizando problemas de precisão ao arredondar valores do ponto médio. Chama-se um método de arredondamento que implementa uma comparação "maior que ou aproximadamente igual a". Ver Arredondamento e precisão.
Arredonda-se um valor fracionário para um inteiro que seja maior do que o valor fracionário. Por exemplo, as rondas 3.1 a 4. Ceiling
Arredonda-se um valor fracionário para um inteiro que seja inferior ao valor fracionário. Por exemplo, rondas 3.9 a 3. Floor

Valores do ponto médio e convenções de arredondamento

Arredondar envolve converter um valor numérico com uma precisão especificada para um valor com menor precisão. Por exemplo, pode usar o Round(Double) método para arredondar um valor de 3,4 para 3,0, e o Round(Double, Int32) método para arredondar um valor de 3,579 para 3,58.

Num valor de ponto médio, o valor após o dígito menos significativo do resultado está precisamente a meio caminho entre dois números. Por exemplo, 3,47500 é um valor de ponto médio se for arredondado para duas casas decimais, e 7,500 é um valor de ponto médio se for arredondado para um inteiro. Nestes casos, se for usada a estratégia de arredondar para o mais próximo, o valor mais próximo não pode ser facilmente identificado sem uma convenção de arredondamento.

O Round método suporta duas convenções de arredondamento para lidar com valores de ponto médio:

  • Arredondando a partir do zero

    Os valores do ponto médio são arredondados para o número seguinte a partir de zero. Por exemplo, 3,75 rodadas para 3,8, 3,85 para 3,9, -3,75 para -3,8 e -3,85 para -3,9. Esta forma de arredondamento é representada pelo MidpointRounding.AwayFromZero membro de enumeração.

  • Arredondando para o par mais próximo, ou arredondamento do banqueiro

    Os valores do ponto médio são arredondados para o número par mais próximo. Por exemplo, tanto 3,75 como 3,85 arredondam para 3,8, e ambos -3,75 e -3,85 para -3,8. Esta forma de arredondamento é representada pelo MidpointRounding.ToEven membro de enumeração.

Note

Nas versões .NET Core 3.0 e posteriores, estão disponíveis três estratégias adicionais de arredondamento através da enumeração MidpointRounding. Estas estratégias são usadas em todos os casos, não apenas para valores de ponto médio como MidpointRounding.ToEven e MidpointRounding.AwayFromZero são.

Arredondar a partir de zero é a forma de arredondamento mais conhecida, enquanto arredondar para o mais próximo par é o padrão em operações financeiras e estatísticas. Está em conformidade com a Norma IEEE 754, secção 4. Quando usado em operações de arredondamento múltiplo, arredondar para o mais próximo ainda reduz o erro de arredondamento causado pelo arredondamento consistente dos valores do ponto médio numa única direção. Em alguns casos, este erro de arredondamento pode ser significativo.

O exemplo seguinte ilustra o viés que pode resultar de arredondar consistentemente os valores do ponto médio numa única direção. O exemplo calcula a média verdadeira de um array de Decimal valores e depois calcula a média quando os valores do array são arredondados usando as duas convenções. Neste exemplo, a média verdadeira e a média que resulta ao arredondar para o mais próximo são as mesmas. No entanto, a média que resulta ao arredondar a partir de zero difere em 0,05 (ou 3,6%) da média verdadeira.

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

Por defeito, o Round método usa a convenção de arredondar para o mais próximo par. A tabela seguinte lista as sobrecargas do Round método e a convenção de arredondamento que cada um utiliza.

Overload Convenção de arredondamento
Round(Decimal) ToEven
Round(Double) ToEven
Round(Decimal, Int32) ToEven
Round(Double, Int32) ToEven
Round(Decimal, MidpointRounding) Determinado por mode parâmetro.
Round(Double, MidpointRounding) Determinado pelo mode parâmetro
Round(Decimal, Int32, MidpointRounding) Determinado pelo mode parâmetro
Round(Double, Int32, MidpointRounding) Determinado pelo mode parâmetro

Arredondamento e precisão

Para determinar se uma operação de arredondamento envolve um valor de ponto médio, o Round método multiplica o valor original a arredondar por 10n, onde n é o número desejado de dígitos fracionários no valor de retorno, e depois determina se a porção fracionária restante do valor é maior ou igual a 0,5. Esta é uma ligeira variação de um teste de igualdade e, como discutido na secção "Testar a Igualdade" do Double tópico de referência, os testes de igualdade com valores de ponto flutuante são problemáticos devido aos problemas do formato de ponto flutuante com representação binária e precisão. Isto significa que qualquer fração de um número que seja ligeiramente inferior a 0,5 (devido à perda de precisão) não será arredondada para cima.

O exemplo a seguir ilustra o problema. Adiciona repetidamente 0,1 a 11,0 e arredonda o resultado para o número inteiro mais próximo. 11,5 deve arredondar para 12 usando qualquer uma das convenções de arredondamento do ponto médio (ToEven ou AwayFromZero). No entanto, como mostra o resultado do exemplo, não o faz. O exemplo utiliza a cadeia numérica padrão "R" para mostrar a precisão total do valor do ponto flutuante e mostra que o valor a arredondar perdeu precisão durante adições repetidas, sendo que o seu valor é na verdade 11,499999999999999998. Como .499999999999998 é inferior a 0,5, as convenções de arredondamento do ponto médio não entram em jogo e o valor é arredondado para baixo. Como o exemplo também mostra, este problema não ocorre se atribuir o valor constante 11,5 a uma Double variável.

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

Problemas de precisão no arredondamento dos valores do ponto médio são mais prováveis de surgir nas seguintes condições:

Nos casos em que a falta de precisão nas operações de arredondamento é problemática, pode fazer o seguinte:

  • Se a operação de arredondamento chamar uma sobrecarga que arredonda um Double valor, pode mudar o Double para um Decimal valor e chamar uma sobrecarga que arredonda um Decimal valor em vez disso. Embora o Decimal tipo de dado também tenha problemas de representação e perda de precisão, estes problemas são muito menos comuns.

  • Defina um algoritmo de arredondamento personalizado que realize um teste "quase igual" para determinar se o valor a arredondar está aceitivelmente próximo de um valor do ponto médio. O exemplo seguinte define um RoundApproximate método que examina se um valor fracionário está suficientemente próximo de um valor do ponto médio para estar sujeito a arredondamento do ponto médio. Como mostra o resultado do exemplo, corrige o problema de arredondamento mostrado no exemplo anterior.

    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
    

Arredondamento e valores de ponto flutuante de precisão simples

O Round método inclui sobrecargas que aceitam argumentos do tipo Decimal e Double. Não existem métodos que arredondam valores do tipo Single. Se passar um valor Single a uma das sobrecargas do método Round, ele é cast (em C#) ou convertido (em Visual Basic) num Double, e a correspondente sobrecarga Round com um parâmetro Double é chamada. Embora esta seja uma conversão de alargamento, muitas vezes implica uma perda de precisão, como ilustra o exemplo seguinte. Quando um Single valor de 16,325 é passado ao Round método e arredondado para duas casas decimais usando o arredondamento para a convenção mais próxima, o resultado é 16,33 e não o resultado esperado de 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

Este resultado inesperado deve-se a uma perda de precisão na conversão do Single valor para um Double. Como o valor resultante Double de 16,325000762939453 não é um valor de ponto médio e é superior a 16,325, é sempre arredondado para cima.

Em muitos casos, como o exemplo ilustra, a perda de precisão pode ser minimizada ou eliminada fundindo ou convertendo o Single valor para um Decimal. Note-se que, por se tratar de uma conversão de estreito, requer o uso de um operador cast ou chamar um método de conversão.

Round(Double, Int32, MidpointRounding)

Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs

Arredonda um valor de ponto flutuante de dupla precisão para um número especificado de dígitos fracionários usando a convenção de arredondamento especificada.

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

Parâmetros

value
Double

Um número de ponto flutuante de dupla precisão a arredondar.

digits
Int32

O número de dígitos fracionários no valor de retorno.

mode
MidpointRounding

Um dos valores de enumeração que especifica qual estratégia de arredondamento usar.

Devoluções

O número que tem digits dígitos fracionários que value é arredondado para. Se value tiver menos dígitos fracionários do que digits, value é devolvido inalterado.

Exceções

digits é inferior a 0 ou superior a 15.

mode não é um valor válido de MidpointRounding.

Observações

O valor do digits argumento pode variar de 0 a 15. O número máximo de dígitos inteiros e fracionários suportados pelo Double tipo é 15.

Consulte Valores do ponto médio e convenções de arredondamento para informações sobre arredondar números com valores do ponto médio.

Importante

Ao arredondar valores do ponto médio, o algoritmo de arredondamento realiza um teste de igualdade. Devido a problemas de representação binária e precisão no formato de ponto flutuante, o valor devolvido pelo método pode ser inesperado. Para mais informações, consulte Arredondamento e precisão.

Se o valor do value argumento for Double.NaN, o método devolve Double.NaN. Se value for Double.PositiveInfinity ou Double.NegativeInfinity, o método devolve Double.PositiveInfinity ou Double.NegativeInfinity, respetivamente.

Example

O exemplo seguinte demonstra como usar o Round(Double, Int32, MidpointRounding) método com a MidpointRounding enumeração.


// 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)

Notas para Chamadores

Devido à perda de precisão que pode resultar de representar valores decimais como números de vírgula flutuante ou de realizar operações aritméticas em valores de vírgula flutuante, em alguns casos o Round(Double, Int32, MidpointRounding) método pode não parecer arredondar valores de ponto médio conforme especificado pelo mode parâmetro. Isto é ilustrado no exemplo seguinte, onde 2,135 é arredondado para 2,13 em vez de 2,14. Isto ocorre porque, internamente, o método multiplica value por 10dígitos, e a operação de multiplicação neste caso sofre de perda de precisão.

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

Ver também

Aplica-se a

Round(Decimal, Int32, MidpointRounding)

Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs

Arredonda um valor decimal para um número especificado de dígitos fracionários usando a convenção de arredondamento especificada.

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

Parâmetros

d
Decimal

Um número decimal a arredondar.

decimals
Int32

O número de casas decimais no valor de retorno.

mode
MidpointRounding

Um dos valores de enumeração que especifica qual estratégia de arredondamento usar.

Devoluções

O número com decimals dígitos fracionários que d é arredondado para. Se d tiver menos dígitos fracionários do que decimals, d é devolvido inalterado.

Exceções

decimals é inferior a 0 ou superior a 28.

mode não é um valor válido de MidpointRounding.

O resultado está fora do intervalo de um Decimal.

Observações

Consulte Valores do ponto médio e convenções de arredondamento para informações sobre arredondar números com valores do ponto médio.

Importante

Ao arredondar valores do ponto médio, o algoritmo de arredondamento realiza um teste de igualdade. Devido a problemas de representação binária e precisão no formato de ponto flutuante, o valor devolvido pelo método pode ser inesperado. Para mais informações, consulte Arredondamento e precisão.

O valor do decimals argumento pode variar de 0 a 28.

Example

O exemplo seguinte demonstra como usar o Round método com a MidpointRounding enumeração.

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)
'

Ver também

Aplica-se a

Round(Double, MidpointRounding)

Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs

Arredonda um valor de ponto flutuante de dupla precisão para um inteiro usando a convenção de arredondamento especificada.

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

Parâmetros

value
Double

Um número de ponto flutuante de dupla precisão a arredondar.

mode
MidpointRounding

Um dos valores de enumeração que especifica qual estratégia de arredondamento usar.

Devoluções

O inteiro arredondado value para. Este método devolve um Double tipo em vez de inteiro.

Exceções

mode não é um valor válido de MidpointRounding.

Observações

Consulte Valores do ponto médio e convenções de arredondamento para informações sobre arredondar números com valores do ponto médio.

Importante

Ao arredondar valores do ponto médio, o algoritmo de arredondamento realiza um teste de igualdade. Devido a problemas de representação binária e precisão no formato de ponto flutuante, o valor devolvido pelo método pode ser inesperado. Para mais informações, consulte Arredondamento e precisão.

Se o valor do value argumento for Double.NaN, o método devolve Double.NaN. Se value for Double.PositiveInfinity ou Double.NegativeInfinity, o método devolve Double.PositiveInfinity ou Double.NegativeInfinity, respetivamente.

Example

O exemplo seguinte mostra os valores devolvidos pelo Round(Double, MidpointRounding) método com valores diferentes mode .

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

Notas para Chamadores

Devido à perda de precisão que pode resultar de representar valores decimais como números de vírgula flutuante ou de realizar operações aritméticas em valores de vírgula flutuante, em alguns casos o Round(Double, MidpointRounding) método pode não parecer arredondar valores do ponto médio para o inteiro par mais próximo. No exemplo seguinte, como o valor de ponto flutuante .1 não tem representação binária finita, a primeira chamada ao Round(Double) método com valor 11,5 devolve 11 em vez de 12.

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

Ver também

Aplica-se a

Round(Double, Int32)

Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs

Arredonda um valor de ponto flutuante de precisão dupla para um número especificado de dígitos fracionários, e arredonda valores do ponto médio para o número par mais próximo.

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

Parâmetros

value
Double

Um número de ponto flutuante de dupla precisão a arredondar.

digits
Int32

O número de dígitos fracionários no valor de retorno.

Devoluções

O número mais próximo de value isso contém um número de dígitos fracionários igual a digits.

Exceções

digits é inferior a 0 ou superior a 15.

Observações

O valor do digits argumento pode variar de 0 a 15. O número máximo de dígitos inteiros e fracionários suportados pelo Double tipo é 15.

Este método utiliza a convenção de arredondamento padrão de MidpointRounding.ToEven. Consulte Valores do ponto médio e convenções de arredondamento para informações sobre arredondar números com valores do ponto médio.

Importante

Ao arredondar valores do ponto médio, o algoritmo de arredondamento realiza um teste de igualdade. Devido a problemas de representação binária e precisão no formato de ponto flutuante, o valor devolvido pelo método pode ser inesperado. Para mais informações, consulte Arredondamento e precisão.

Se o valor do value argumento for Double.NaN, o método devolve Double.NaN. Se value for Double.PositiveInfinity ou Double.NegativeInfinity, o método devolve Double.PositiveInfinity ou Double.NegativeInfinity, respetivamente.

Example

O exemplo seguinte arredonda valores duplos com dois dígitos fracionários para duplos que têm um único dígito fracionário.

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

Notas para Chamadores

Devido à perda de precisão que pode resultar de representar valores decimais como números de vírgula flutuante ou de realizar operações aritméticas em valores de vírgula flutuante, em alguns casos o Round(Double, Int32) método pode não parecer arredondar valores do ponto médio para o valor par mais próximo na digits posição decimal. Isto é ilustrado no exemplo seguinte, onde 2,135 é arredondado para 2,13 em vez de 2,14. Isto ocorre porque, internamente, o método multiplica value por 10dígitos, e a operação de multiplicação neste caso sofre de perda de precisão.

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

Ver também

Aplica-se a

Round(Decimal, Int32)

Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs

Arredonda um valor decimal para um número especificado de dígitos fracionários, e arredonda valores do ponto médio para o número par mais próximo.

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

Parâmetros

d
Decimal

Um número decimal a arredondar.

decimals
Int32

O número de casas decimais no valor de retorno.

Devoluções

O número mais próximo de d isso contém um número de dígitos fracionários igual a decimals.

Exceções

decimals é inferior a 0 ou superior a 28.

O resultado está fora do intervalo de um Decimal.

Observações

O valor do decimals argumento pode variar de 0 a 28.

Este método utiliza a convenção de arredondamento padrão de MidpointRounding.ToEven. Para informações sobre arredondamento de números com valores do ponto médio, veja Valores do ponto médio e convenções de arredondamento.

Importante

Ao arredondar valores do ponto médio, o algoritmo de arredondamento realiza um teste de igualdade. Devido a problemas de representação binária e precisão no formato de ponto flutuante, o valor devolvido pelo método pode ser inesperado. Para mais informações, consulte Arredondamento e precisão.

Example

O exemplo seguinte arredonda valores decimais com dois dígitos fracionários para valores que têm um único dígito fracionário.

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

Ver também

Aplica-se a

Round(Double)

Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs

Arredonda um valor de ponto flutuante de dupla precisão ao valor integral mais próximo, e arredonda valores do ponto médio ao número par mais próximo.

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

Parâmetros

a
Double

Um número de ponto flutuante de dupla precisão a arredondar.

Devoluções

O inteiro mais próximo ade . Se o componente fracionário de a estiver a meio caminho entre dois inteiros, um dos quais é par e o outro ímpar, então o número par é devolvido. Note-se que este método devolve um Double em vez de um tipo inteiro.

Observações

Este método utiliza a convenção de arredondamento padrão de MidpointRounding.ToEven. Para informações sobre arredondamento de números com valores do ponto médio, veja Valores do ponto médio e convenções de arredondamento.

Importante

Ao arredondar valores do ponto médio, o algoritmo de arredondamento realiza um teste de igualdade. Devido a problemas de representação binária e precisão no formato de ponto flutuante, o valor devolvido pelo método pode ser inesperado. Para mais informações, consulte Arredondamento e precisão.

Se o valor do a argumento for Double.NaN, o método devolve Double.NaN. Se a for Double.PositiveInfinity ou Double.NegativeInfinity, o método devolve Double.PositiveInfinity ou Double.NegativeInfinity, respetivamente.

A partir de Visual Basic 15.8, o desempenho da conversão de Duplo para inteiro é otimizado se passar o valor devolvido pelo método Round para qualquer uma das funções de conversão integral, ou se o valor Duplo devolvido por Round for automaticamente convertido num inteiro com Opção Estrito definido para Desligado. Essa otimização permite que o código seja executado mais rapidamente -- até duas vezes mais rápido para o código que faz um grande número de conversões para tipos inteiros. O exemplo seguinte ilustra essas conversões otimizadas:

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

Example

O exemplo seguinte demonstra arredondamento para o valor inteiro mais próximo.

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

Notas para Chamadores

Devido à perda de precisão que pode resultar de representar valores decimais como números de vírgula flutuante ou de realizar operações aritméticas em valores de vírgula flutuante, em alguns casos o Round(Double) método pode não parecer arredondar valores do ponto médio para o inteiro par mais próximo. No exemplo seguinte, como o valor de ponto flutuante .1 não tem representação binária finita, a primeira chamada ao Round(Double) método com valor 11,5 devolve 11 em vez de 12.

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

Ver também

Aplica-se a

Round(Decimal)

Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs

Arredonda um valor decimal para o valor integral mais próximo e arredonda valores do ponto médio para o número par mais próximo.

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

Parâmetros

d
Decimal

Um número decimal a arredondar.

Devoluções

O inteiro mais próximo do d parâmetro. Se a componente fracionária de d estiver a meio caminho entre dois inteiros, um dos quais é par e o outro ímpar, o número par é devolvido. Note-se que este método devolve um Decimal em vez de um tipo inteiro.

Exceções

O resultado está fora do intervalo de um Decimal.

Exemplos

O exemplo seguinte demonstra o Round(Decimal) método. O Decimal valor de 4,5 tiros para 4 em vez de 5, porque esta sobrecarga usa a convenção padrão ToEven .

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

Observações

Este método utiliza a convenção de arredondamento padrão de MidpointRounding.ToEven. Para informações sobre arredondamento de números com valores do ponto médio, veja Valores do ponto médio e convenções de arredondamento.

Importante

Ao arredondar valores do ponto médio, o algoritmo de arredondamento realiza um teste de igualdade. Devido a problemas de representação binária e precisão no formato de ponto flutuante, o valor devolvido pelo método pode ser inesperado. Para mais informações, consulte Arredondamento e precisão.

Ver também

Aplica-se a

Round(Decimal, MidpointRounding)

Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs
Origem:
Math.cs

Arredonda um valor decimal um inteiro usando a convenção de arredondamento especificada.

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

Parâmetros

d
Decimal

Um número decimal a arredondar.

mode
MidpointRounding

Um dos valores de enumeração que especifica qual estratégia de arredondamento usar.

Devoluções

O inteiro arredondado d para. Este método devolve um Decimal tipo em vez de inteiro.

Exceções

mode não é um valor válido de MidpointRounding.

O resultado está fora do intervalo de um Decimal.

Observações

Para informações sobre arredondamento de números com valores do ponto médio, veja Valores do ponto médio e convenções de arredondamento.

Importante

Ao arredondar valores do ponto médio, o algoritmo de arredondamento realiza um teste de igualdade. Devido a problemas de representação binária e precisão no formato de ponto flutuante, o valor devolvido pelo método pode ser inesperado. Para mais informações, consulte Arredondamento e precisão.

Example

O exemplo seguinte mostra os valores devolvidos pelo Round(Decimal, MidpointRounding) método com valores diferentes mode .

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

Ver também

Aplica-se a