浮點數值型別 (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)。 每個浮點數型別都有 MinValueMaxValue 常數,提供該型別的最小與最大有限值。 floatdouble 型別也提供表示不是數字和無限值的常數。 例如,double 型別提供下列常數:Double.NaNDouble.NegativeInfinityDouble.PositiveInfinity

decimal當所需的精確度程度是由小數點右邊的數位數目所決定時,此類型就適用。 這類數位通常用於財務應用程式、貨幣金額 (例如 $1.00) 、利率 (例如 2.625%) 等等。 即使是只精確到一個十進位數的數位,類型也會更精確地 decimal 處理:例如,0.1 可以完全由 decimal 實例表示,而沒有 doublefloat 實例完全代表 0.1。 由於數數值型別的差異,因此當您使用 doublefloat 用於十進位資料時,算術計算中可能會發生非預期的四捨五入錯誤。 比起確保精確度,您可以在優化效能時使用 double ,而不是 decimal 使用 。 不過,效能上的任何差異都會被所有計算密集型應用程式所忽略。 另一個可能 decimal 避免的原因是將儲存體需求降到最低。 例如, ML.NET 會使用 float ,因為 4 個位元組與 16 個位元組之間的差異會加總非常大的資料集。 如需詳細資訊,請參閱System.Decimal

您可以在運算式中混合 整數 型別和 floatdouble 型別。 在此情況下,整數型別會隱含轉換成其中一個浮點型別,如有必要,型 float 別會隱含轉換成 double 。 運算式評估如下:

  • double如果運算式中有類型,則運算式會評估為 double ,或在 bool 關聯式和相等比較中評估為 。
  • 如果運算式中沒有 double 類型,運算式會評估為 float ,或在 bool 關聯式和相等比較中評估為 。

您也可以在運算式中混合整數型別和 decimal 型別。 在此情況下,整數型別會隱含轉換成 decimal 型別,而運算式會評估為 decimal ,或在 bool 關聯式和相等比較中轉換為 。

您無法在運算式中混用 decimal 型別與 floatdouble 型別。 在此情況下,如果您想要執行算術、比較或等號比較運算,則必須明確地將運算元從 或 decimal 轉換成 類型,如下列範例所示:

double a = 1.0;
decimal b = 2.1m;
Console.WriteLine(a + (double)b);
Console.WriteLine((decimal)a + b);

您可以使用標準數值格式字串自訂數值格式字串,設定浮點數值格式。

實際常值

實際常值的型別取決於其後綴,如下所示:

  • 不含尾碼或 或 dD 尾碼的常數值型別為 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

轉換

浮點數數值型別之間只有一個隱含轉換:從 floatdouble 。 不過,您可以使用 明確轉換,將任何浮點類型轉換成任何其他浮點類型。 如需詳細資訊,請參閱 內建數值轉換

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格的下列幾節:

另請參閱