Estructura System.Decimal

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

El Decimal tipo de valor representa números decimales que van desde 79,228,162,514,264,337,593,543,950,950,335 a negativo 79,228,162,514,264,337,593,543,950,335. El valor predeterminado de es Decimal 0. El Decimal tipo de valor es adecuado para los cálculos financieros que requieren un gran número de dígitos enteros y fraccionarios significativos y sin errores de redondeo. El Decimal tipo no elimina la necesidad de redondear. En su lugar, minimiza los errores debido al redondeo. Por ejemplo, el código siguiente genera un resultado de 0,9999999999999999999999999999999999999 en lugar de 1.

decimal dividend = Decimal.One;
decimal divisor = 3;
// The following displays 0.9999999999999999999999999999 to the console
Console.WriteLine(dividend/divisor * divisor);
let dividend = Decimal.One
let divisor = 3m
// The following displays 0.9999999999999999999999999999 to the console
printfn $"{dividend/divisor * divisor}"
Dim dividend As Decimal = Decimal.One
Dim divisor As Decimal = 3
' The following displays 0.9999999999999999999999999999 to the console
Console.WriteLine(dividend/divisor * divisor)

Cuando el resultado de la división y multiplicación se pasa al Round método , el resultado no sufre ninguna pérdida de precisión, como se muestra en el código siguiente.

decimal dividend = Decimal.One;
decimal divisor = 3;
// The following displays 1.00 to the console
Console.WriteLine(Math.Round(dividend/divisor * divisor, 2));
let dividend = Decimal.One
let divisor = 3m
// The following displays 1.00 to the console
printfn $"{Math.Round(dividend/divisor * divisor, 2)}"
Dim dividend As Decimal = Decimal.One
Dim divisor As Decimal = 3
' The following displays 1.00 to the console
Console.WriteLine(Math.Round(dividend/divisor * divisor, 2))

Un número decimal es un valor de punto flotante que consta de un signo, un valor numérico donde cada dígito del valor oscila entre 0 y 9 y un factor de escala que indica la posición de un separador decimal flotante que separa las partes integrales y fraccionarios del valor numérico.

La representación binaria de un Decimal valor es de 128 bits que consta de un número entero de 96 bits y un conjunto de 32 bits de marcas que representan elementos como el signo y el factor de escala que se usa para especificar qué parte de es una fracción decimal. Por lo tanto, la representación binaria de un Decimal valor con el formato (-2de 96 a 296) / 10(0 a 28)), donde -(296-1) es igual a MinValuey 296-1 es igual a MaxValue. Para obtener más información sobre la representación binaria de Decimal valores y un ejemplo, vea el Decimal(Int32[]) constructor y el GetBits método .

El factor de escalado también conserva los ceros finales de un Decimal número. Los ceros finales no afectan al valor de un Decimal número en operaciones aritméticas o de comparación. Sin embargo, el ToString método podría revelar ceros finales si se aplica una cadena de formato adecuada.

Consideraciones sobre la conversión

Este tipo proporciona métodos que convierten Decimal valores en y desde SBytelos valores , Int16, ByteInt64UInt16Int32, , UInt32y .UInt64 Las conversiones de estos tipos enteros a Decimal son conversiones de ampliación que nunca pierden información ni inician excepciones.

Las conversiones de Decimal a cualquiera de los tipos enteros son conversiones de restricción que redondean el Decimal valor al valor entero más cercano hacia cero. Algunos lenguajes, como C#, también admiten la conversión de Decimal valores a Char valores. Si el resultado de estas conversiones no se puede representar en el tipo de destino, se produce una OverflowException excepción.

El Decimal tipo también proporciona métodos que convierten Decimal valores en valores y desde Single y Double . Las conversiones de Decimal a o SingleDouble son conversiones de restricción que podrían perder precisión, pero no información sobre la magnitud del valor convertido. La conversión no produce una excepción.

Conversiones de Single o Double para Decimal producir una OverflowException excepción si el resultado de la conversión no se puede representar como .Decimal

Realización de operaciones en valores decimales

El Decimal tipo admite operaciones matemáticas estándar, como suma, resta, división, multiplicación y negación unaria. También puede trabajar directamente con la representación binaria de un Decimal valor llamando al GetBits método .

Para comparar dos Decimal valores, puede usar los operadores de comparación numéricos estándar o puede llamar al CompareTo método o Equals .

También puede llamar a los miembros de la Math clase para realizar una amplia gama de operaciones numéricas, incluida la obtención del valor absoluto de un número, determinar el valor máximo o mínimo de dos Decimal valores, obtener el signo de un número y redondear un número.

Ejemplos

En el siguiente ejemplo de código se muestra el uso de Decimal.

/// <summary>
/// Keeping my fortune in Decimals to avoid the round-off errors.
/// </summary>
class PiggyBank {
    protected decimal MyFortune;

    public void AddPenny() {
        MyFortune = Decimal.Add(MyFortune, .01m);
    }

    public decimal Capacity {
        get {
            return Decimal.MaxValue;
        }
    }

    public decimal Dollars {
        get {
            return Decimal.Floor(MyFortune);
        }
    }

    public decimal Cents {
        get {
            return Decimal.Subtract(MyFortune, Decimal.Floor(MyFortune));
        }
    }

    public override string ToString() {
        return MyFortune.ToString("C")+" in piggy bank";
    }
}
/// Keeping my fortune in Decimals to avoid the round-off errors.
type PiggyBank() =
    let mutable myFortune = 0m

    member _.AddPenny() =
        myFortune <- Decimal.Add(myFortune, 0.01m)

    member _.Capacity =
        Decimal.MaxValue

    member _.Dollars =
        Decimal.Floor myFortune

    member _.Cents =
        Decimal.Subtract(myFortune, Decimal.Floor myFortune)

    override _.ToString() =
        $"{myFortune:C} in piggy bank"
' Keeping my fortune in Decimals to avoid the round-off errors.
Class PiggyBank
    Protected MyFortune As Decimal

    Public Sub AddPenny()
        MyFortune = [Decimal].Add(MyFortune, 0.01D)
    End Sub

    Public ReadOnly Property Capacity() As Decimal
        Get
            Return [Decimal].MaxValue
        End Get
    End Property

    Public ReadOnly Property Dollars() As Decimal
        Get
            Return [Decimal].Floor(MyFortune)
        End Get
    End Property

    Public ReadOnly Property Cents() As Decimal
        Get
            Return [Decimal].Subtract(MyFortune, [Decimal].Floor(MyFortune))
        End Get
    End Property

    Public Overrides Function ToString() As String
        Return MyFortune.ToString("C") + " in piggy bank"
    End Function
End Class