System.Decimal, struktura
Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.
Typ Decimal wartości reprezentuje liczby dziesiętne z dodatnich 79,228,162,514,264,337,593,543,950,950 335 do ujemnych 79,228,162,514,264,337,593,543,950,335. Wartość domyślna elementu to Decimal
0. Typ Decimal wartości jest odpowiedni dla obliczeń finansowych, które wymagają dużej liczby znaczących cyfr całkowitych i ułamkowych i bez błędów zaokrąglania. Typ Decimal nie eliminuje potrzeby zaokrąglania. Zamiast tego minimalizuje błędy z powodu zaokrąglania. Na przykład poniższy kod generuje wynik 0,9999999999999999999999999999999 zamiast 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)
Gdy wynik dzielenia i mnożenia jest przekazywany do Round metody, wynik nie traci precyzji, jak pokazano w poniższym kodzie.
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))
Liczba dziesiętna jest wartością zmiennoprzecinkową, która składa się ze znaku, wartości liczbowej, w której każda cyfra w wartości waha się od 0 do 9, oraz współczynnik skalowania wskazujący położenie zmiennoprzecinkowego separatora dziesiętnego oddzielającego części całkowite i ułamkowe wartości liczbowej.
Binarna reprezentacja Decimal
wartości to 128-bitowa liczba całkowita składająca się z 96-bitowej liczby całkowitej oraz 32-bitowy zestaw flag reprezentujących elementy, takie jak znak i współczynnik skalowania używany do określenia, która część z niej jest ułamkiem dziesiętnym. Dlatego reprezentacja binarna Decimal wartości formularza (-296 do 296) / 10(0 do 28)), gdzie -(296-1) jest równa MinValue, a 296-1 jest równe MaxValue. Aby uzyskać więcej informacji na temat binarnej reprezentacji wartości i przykładu Decimal , zobacz Decimal(Int32[]) konstruktor i metodę GetBits .
Współczynnik skalowania zachowuje również wszystkie końcowe zera w Decimal liczbie. Zera końcowe nie mają wpływu na wartość Decimal liczby w operacjach arytmetycznych lub porównawczych. Jednak końcowe zera mogą zostać ujawnione przez metodę ToString , jeśli zastosowano odpowiedni ciąg formatu.
Zagadnienia dotyczące konwersji
Ten typ udostępnia metody, które konwertują Decimal wartości na i z SBytewartości , , UInt16Int64Int32ByteInt16UInt32i .UInt64 Konwersje z tych typów całkowitych do Decimal są rozszerzające konwersje, które nigdy nie tracą informacji ani nie zgłaszają wyjątków.
Konwersje z Decimal do dowolnego z typów całkowitych są zawężające konwersje, które zaokrąglają Decimal wartość do najbliższej wartości całkowitej w kierunku zera. Niektóre języki, takie jak C#, obsługują również konwersję Decimal wartości na Char wartości. Jeśli wynik tych konwersji nie może być reprezentowany w typie docelowym, OverflowException zgłaszany jest wyjątek.
Typ Decimal udostępnia również metody, które konwertują Decimal wartości na wartości i i SingleDouble . Konwersje z Decimal do lub DoubleSingle są zawężające konwersje, które mogą utracić precyzję, ale nie informacje o wielkości przekonwertowanej wartości. Konwersja nie zgłasza wyjątku.
Konwersje z Single lub Double zgłaszają DecimalOverflowException wyjątek, jeśli wynik konwersji nie może być reprezentowany jako Decimal.
Wykonywanie operacji na wartościach dziesiętnych
Typ Decimal obsługuje standardowe operacje matematyczne, takie jak dodawanie, odejmowanie, dzielenie, mnożenie i negacja jednoargumentowa. Możesz również pracować bezpośrednio z reprezentacją binarną Decimal wartości, wywołując metodę GetBits .
Aby porównać dwie Decimal wartości, można użyć standardowych operatorów porównania liczbowego lub wywołać metodę CompareTo lub Equals .
Można również wywołać elementy członkowskie Math klasy, aby wykonać szeroką gamę operacji liczbowych, w tym uzyskanie wartości bezwzględnej liczby, określenie maksymalnej lub minimalnej wartości dwóch Decimal wartości, uzyskanie znaku liczby i zaokrąglenie liczby.
Przykłady
W poniższym przykładzie kodu pokazano użycie metody 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