System.Decimal – struktura

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

Typ Decimal hodnoty představuje desetinná čísla od kladných 79 228 162 514 264 337 593 543 950 2 335 až záporná 79 228 162 514 264 337 593 543 950 335. Výchozí hodnota je Decimal 0. Typ Decimal hodnoty je vhodný pro finanční výpočty, které vyžadují velký počet významných integrálních a desetinných číslic a bez chyb zaokrouhlení. Typ Decimal neodstraní potřebu zaokrouhlování. Místo toho minimalizuje chyby způsobené zaokrouhlení. Například následující kód vytvoří výsledek 0,99999999999999999999999999999 místo 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)

Když je výsledek dělení a násobení předán metodě Round , výsledek nebude mít žádnou ztrátu přesnosti, jak ukazuje následující kód.

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

Desetinné číslo je hodnota s plovoucí desetinnou čárkou, která se skládá ze znaménka, číselné hodnoty, kde každá číslice v rozsahu hodnot je od 0 do 9, a koeficient, který označuje pozici desetinné čárky s plovoucí desetinnou čárkou, která odděluje integrální a zlomkové části číselné hodnoty.

Binární reprezentace Decimal hodnoty je 128 bitů skládající se z 96bitového celočíselného čísla a 32bitová sada příznaků představujících věci, jako je znaménko a měřítko použité k určení části čísla desetinné čárky. Proto binární reprezentace Decimal hodnoty, (-2 96 až 296) / 10(0 až 28)), kde -(296-1) se rovná MinValue, a 296-1 se rovná MaxValue. Další informace o binární reprezentaci Decimal hodnot a příkladu naleznete v Decimal(Int32[]) konstruktoru GetBits a metodě.

Faktor škálování také zachovává koncové nuly v Decimal čísle. Koncové nuly nemají vliv na hodnotu Decimal čísla v aritmetických operacích ani operací porovnání. Koncové nuly však může metoda odhalit ToString , pokud je použit odpovídající formátovací řetězec.

Důležité informace o převodu

Tento typ poskytuje metody, které převádějí Decimal hodnoty na a z SByte, , Int16Int32, Int64, Byte, UInt16UInt32a UInt64 hodnoty. Převody z těchto integrálních typů na Decimal rozšiřující převody, které nikdy nepřijdou o informace nebo vyvolá výjimky.

Převody z Decimal libovolného celočíselného typu jsou zužující převody, které zaokrouhlují Decimal hodnotu na nejbližší celočíselnou hodnotu směrem k nule. Některé jazyky, například C#, podporují také převod Decimal hodnot na Char hodnoty. Pokud výsledek těchto převodů nelze reprezentovat v cílovém typu, OverflowException vyvolá se výjimka.

Tento Decimal typ také poskytuje metody, které převádějí Decimal hodnoty na hodnoty a z Single hodnot a Double z hodnot. Převody z převodu na DecimalSingle nebo Double jsou zužující převody, které mohou ztratit přesnost, ale ne informace o velikosti převedené hodnoty. Převod nevyvolá výjimku.

Převody z Single nebo Double na Decimal vyvolání OverflowException výjimky, pokud výsledek převodu nelze reprezentovat jako Decimal.

Provádění operací s desetinnými hodnotami

Typ Decimal podporuje standardní matematické operace, jako je sčítání, odčítání, dělení, násobení a unární negace. Můžete také pracovat přímo s binární reprezentací Decimal hodnoty voláním GetBits metody.

K porovnání dvou Decimal hodnot můžete použít standardní číselné relační operátory nebo můžete volat metodu nebo Equals metoduCompareTo.

Členy třídy můžete také volat Math , aby provedli širokou škálu číselných operací, včetně získání absolutní hodnoty čísla, určení maximální nebo minimální hodnoty dvou Decimal hodnot, získání znaménka čísla a zaokrouhlení čísla.

Příklady

Následující příklad kódu ukazuje použití 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