Sdílet prostřednictvím


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í. Minimalizuje chyby způsobené zaokrouhlováním. 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 o velikosti 128 bitů, která se skládá z 96bitového celočíselného čísla a 32bitové sady příznaků, která představuje aspekty jako znaménko a měřítko použité k určení, která část je desetinná. Proto binární reprezentace Decimal hodnoty, (-296 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 jsou rozšiřující převody, které nikdy nepřijdou o informace nebo nevyvolají 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, je vyvolána výjimka OverflowException.

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

Převody z Single nebo Double na Decimal vyvolají OverflowException výjimku, pokud výsledek převodu nelze vyjádřit 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 CompareTo nebo metodu Equals.

Můžete také volat členy třídy Math, abyste provedli širokou škálu číselných operací, včetně získání absolutní hodnoty čísla, určení maximální nebo minimální hodnoty dvou hodnot Decimal, určení 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