Struct System.Decimal

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

Il Decimal tipo di valore rappresenta numeri decimali compresi tra 79.228.162.514.264.337.593.543.950,950, 335 a negativo 79.228.162.514.264.337.593.543.950.335. Il valore predefinito di un Decimal oggetto è 0. Il Decimal tipo di valore è appropriato per i calcoli finanziari che richiedono un numero elevato di cifre integrali e frazionarie significative e nessun errore di arrotondamento. Il Decimal tipo non elimina la necessità di arrotondamento. Piuttosto, riduce al minimo gli errori dovuti all'arrotondamento. Ad esempio, il codice seguente produce un risultato di 0,999999999999999999999999999999999 anziché 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)

Quando il risultato della divisione e della moltiplicazione viene passato al Round metodo , il risultato non subisce alcuna perdita di precisione, come illustrato nel codice seguente.

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 numero decimale è un valore a virgola mobile costituito da un segno, un valore numerico in cui ogni cifra del valore è compresa tra 0 e 9 e un fattore di ridimensionamento che indica la posizione di un separatore decimale mobile che separa le parti integrali e frazionarie del valore numerico.

La rappresentazione binaria di un Decimal valore è a 128 bit costituita da un numero intero a 96 bit e da un set di flag a 32 bit che rappresentano elementi come il fattore di firma e ridimensionamento usato per specificare quale parte di esso è una frazione decimale. Di conseguenza, la rappresentazione binaria di un Decimal valore nel formato ((-2da 96 a 296) / 10(da 0 a 28)), dove -(296-1) è uguale a e 296-1 è uguale a MinValueMaxValue. Per altre informazioni sulla rappresentazione binaria dei Decimal valori e su un esempio, vedere il Decimal(Int32[]) costruttore e il GetBits metodo .

Il fattore di ridimensionamento mantiene anche tutti gli zeri finali in un Decimal numero. Gli zeri finali non influiscono sul valore di un Decimal numero nelle operazioni aritmetiche o di confronto. Tuttavia, gli zeri finali potrebbero essere rivelati dal ToString metodo se viene applicata una stringa di formato appropriata.

Considerazioni sulla conversione

Questo tipo fornisce metodi che converte Decimal i valori in e dai SBytevalori , Int16Int32, UInt16UInt32Int64Bytee .UInt64 Le conversioni da questi tipi integrali a Decimal sono conversioni più ampliate che non perdono mai informazioni o generano eccezioni.

Le conversioni da Decimal a uno qualsiasi dei tipi integrali stanno restringendo le conversioni che arrotondano il Decimal valore al valore intero più vicino verso zero. Alcuni linguaggi, ad esempio C#, supportano anche la conversione dei Decimal valori in Char valori. Se il risultato di queste conversioni non può essere rappresentato nel tipo di destinazione, viene generata un'eccezione OverflowException .

Il Decimal tipo fornisce anche metodi che converte Decimal i valori in e da Single e Double . Le conversioni da Decimal a Single o Double sono conversioni di tipo narrowing che potrebbero perdere precisione, ma non informazioni sulla grandezza del valore convertito. La conversione non genera un'eccezione.

Le conversioni da Single o Double per Decimal generare un'eccezione OverflowException se il risultato della conversione non può essere rappresentato come .Decimal

Eseguire operazioni sui valori decimali

Il Decimal tipo supporta operazioni matematiche standard, ad esempio addizione, sottrazione, divisione, moltiplicazione e negazione unaria. È anche possibile usare direttamente la rappresentazione binaria di un Decimal valore chiamando il GetBits metodo .

Per confrontare due Decimal valori, è possibile usare gli operatori di confronto numerici standard oppure chiamare il CompareTo metodo o Equals .

È anche possibile chiamare i membri della Math classe per eseguire un'ampia gamma di operazioni numeriche, tra cui ottenere il valore assoluto di un numero, determinare il valore massimo o minimo di due Decimal valori, ottenere il segno di un numero e arrotondare un numero.

Esempi

L'esempio di codice seguente illustra l'uso di 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