浮點數值型別 (C# 參考)
「浮點數值類型」代表實數。 所有浮點數字型別都是數字型別。 其也是簡單類型,而且可以使用常值進行初始化。 所有浮點數值類型都支援算術、比較和等號運算子。
浮點數型別的特性
C# 支援下列預先定義的浮點數型別:
C# 型別/關鍵字 | 大概範圍 | 精確度 | 大小 | .NET 類型 |
---|---|---|---|---|
float |
±1.5 x 10−45 到 ±3.4 x 1038 | ~6-9 位數 | 4 個位元組 | System.Single |
double |
±5.0 × 10−324 至 ±1.7 × 10308 | ~15-17 位數 | 8 個位元組 | System.Double |
decimal |
±1.0 x 10-28 到 ±7.9228 x 1028 | 28-29 位數 | 16 個位元組 | System.Decimal |
在上表中,最左邊欄中的每個 C# 型別關鍵字,都是相對應 .NET 型別的別名。 它們是可互換的。 例如,下列宣告會宣告相同型別的變數:
double a = 12.3;
System.Double b = 12.3;
每個浮點數型別的預設值都是零 (0
)。 每個浮點數型別都有 MinValue
與 MaxValue
常數,提供該型別的最小與最大有限值。 float
與 double
型別也提供表示不是數字和無限值的常數。 例如,double
型別提供下列常數:Double.NaN、Double.NegativeInfinity 與 Double.PositiveInfinity。
所需的有效位數取決於小數點右側的位數數目時,decimal
類型就適用。 這類數字通常用於財務應用程式的貨幣金額 (例如 $1.00)、利率 (例如 2.625%) 等等。 decimal
類型甚至會更精確地處理只精確到一個小數位數的數字:例如,decimal
執行個體只能代表 0.1,同時沒有只代表 0.1 的 double
或 float
執行個體。 因為數值類型中的這項差異,所以當您將 double
或 float
用於十進位資料時,算術計算中可能會發生非預期的四捨五入錯誤。 最佳化效能比確保精確度更為重要時,您可以使用 double
,而不是 decimal
。 不過,所有應用程式 (最密集計算的應用程式除外) 都會忽略效能中的任何差異。 避免 decimal
的另一個可能原因是將儲存體需求降到最低。 例如,ML.NET 使用 float
,因為 4 位元組和 16 位元組之間的差異加起來會導致非常大型的資料集。 如需詳細資訊,請參閱System.Decimal。
您可以在運算式中混合使用整數類型以及 float
和 double
類型。 在此情況下,整數類型會隱含地轉換成其中一個浮點類型,而且,如有必要,float
類型會隱含轉換成 double
。 運算式 的評估方式如下:
- 如果運算式中具有
double
類型,則運算式會評估為double
或bool
(在關聯或相等比較中)。 - 如果運算式中沒有
double
類型,則運算式會評估為float
或bool
(在關聯或相等比較中)。
您可以在運算式中混合使用整數類型和 decimal
類型。 在此情況下,整數類型會隱含地轉換成 decimal
類型,而運算式會評估為 decimal
或 bool
(在關聯或相等比較中)。
您無法在運算式中混合使用 decimal
類型以及 float
和 double
類型。 在此情況下,如果您想要執行算術、比較或相等運算,則必須從 decimal
類型明確地轉換運算元,或明確地轉換成該類型,如下列範例所示:
double a = 1.0;
decimal b = 2.1m;
Console.WriteLine(a + (double)b);
Console.WriteLine((decimal)a + b);
您可以使用標準數值格式字串或自訂數值格式字串,設定浮點數值格式。
實數常值
實數常值的類型取決於其後置詞,如下所示:
- 不含後置詞或具有
d
或D
後置詞的常值的類型為double
- 具有
f
或F
後置詞的常值的類型為float
- 具有
m
或M
後置詞的常值的類型為decimal
下列程式碼示範各項範例:
double d = 3D;
d = 4d;
d = 3.934_001;
float f = 3_000.5F;
f = 5.4f;
decimal myMoney = 3_000.5m;
myMoney = 400.75M;
上述範例也會示範使用 _
作為數字分隔符號。 您可以搭配使用數字分隔符號與所有類型的數值常值。
您也可以使用科學記號標記法,即指定實數常值的指數部分,如下列範例所示:
double d = 0.42e2;
Console.WriteLine(d); // output 42
float f = 134.45E-2f;
Console.WriteLine(f); // output: 1.3445
decimal m = 1.5E6m;
Console.WriteLine(m); // output: 1500000
轉換
浮點數值類型之間只有一個隱含轉換:從 float
到 double
。 不過,您可以將任何浮點類型轉換成具有明確強制型轉的任何其他浮點類型。 如需詳細資訊,請參閱內建數值轉換。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格的下列幾節: