本文提供此 API 參考文件的補充備註。
Decimal實值型別代表十進制數,範圍從正 79,228,162,514,264,337,593,543,950,335 至負 79,228,162,514,264,337,593,543,950,335。 的預設值 Decimal 為 0。
Decimal 值類型適合用於需要眾多重要整數和小數位且無捨入誤差的財務計算。 此 Decimal 類型不會消除捨入的需求。 相反地,它會減少因四捨五入所造成的錯誤。 例如,下列程式代碼會產生 0.999999999999999999999999999999,而不是 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)
當除法和乘法的結果傳遞至 Round 方法時,結果不會遺失精確度,如下列程式代碼所示。
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))
十進位數是一個浮點值,其中包含符號、數值,其中值中的每個數位範圍從 0 到 9,以及一個縮放比例,表示分隔數值整數和小數部分的浮點位置。
值的二進位表示由一個 128 位元組成,其中包括一個 96 位元的整數數字和一組 32 位元的標誌,用來表示正負號和縮放比例等項目,以指定哪一部分是小數分數。 因此,Decimal 值的二進位表示形式為 ((-2^96 到 2^96) / 10^(0 到 28)),其中 -(2^96-1)等於 MinValue,且 2^96-1 等於 MaxValue。 如需有關Decimal值的二進位表示和範例的詳細資訊,請參閱Decimal(Int32[])構造函式和GetBits方法。
縮放因子也會保留數字中任何尾隨的零。 尾端零不會影響算術或比較運算中數位的值 Decimal 。 不過,如果套用適當的格式字串,ToString 方法可能會顯示尾端零。
轉換考慮
此類型提供的方法可以將Decimal 值轉換成 SByte、Int16、Int32、Int64、Byte、UInt16、UInt32 和 UInt64 值。 轉換從這些整數類型到 Decimal 是擴大的轉換,不會遺失資訊或擲回例外狀況。
從 Decimal 轉換為任何整數型別是窄化轉換,這會將 Decimal 的值朝零方向取整為最接近的整數值。 某些語言,例如 C#,也支援將值Decimal轉換成Char值。 如果這些轉換的結果無法在目的地類型中表示,則會拋出例外狀況。
此Decimal類型還提供方法,可以將Decimal值轉換為Single和Double值,或將Single和Double值轉換為Decimal值。 從 Decimal 轉換到 Single 或 Double 是縮小轉換,可能會導致精度下降,但不會影響轉換後數值的大小資訊。 轉換不會引發例外狀況。
Single 或 Double 轉換到 Decimal 時,如果轉換的結果無法表示為 OverflowException,則會擲回 Decimal 例外狀況。
對十進位值執行作業
此 Decimal 類型支援標準數學運算,例如加法、減法、除法、乘法和一元負數。 您也可以直接使用Decimal值的二進位表示法,透過呼叫GetBits方法。
若要比較兩個 Decimal 值,您可以使用標準數值比較運算符,也可以呼叫 CompareTo 或 Equals 方法。
您也可以呼叫 類別的成員 Math 來執行廣泛的數值運算,包括取得數字的絕對值、判斷兩 Decimal 個值的最大值或最小值、取得數位的正負號,以及四捨五入數位。
範例
下列程式代碼範例示範 如何使用 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