浮點數值型別 (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 類型甚至會更精確地處理只精確到一個小數位數的數字:例如,decimal 執行個體只能代表 0.1,同時沒有只代表 0.1 的 doublefloat 執行個體。 因為數值類型中的這項差異,所以當您將 doublefloat 用於十進位資料時,算術計算中可能會發生非預期的四捨五入錯誤。 最佳化效能比確保精確度更為重要時,您可以使用 double,而不是 decimal。 不過,所有應用程式 (最密集計算的應用程式除外) 都會忽略效能中的任何差異。 避免 decimal 的另一個可能原因是將儲存體需求降到最低。 例如,ML.NET 使用 float,因為 4 位元組和 16 位元組之間的差異加起來會導致非常大型的資料集。 如需詳細資訊,請參閱System.Decimal

您可以在運算式中混合使用整數類型以及 floatdouble 類型。 在此情況下,整數類型會隱含地轉換成其中一個浮點類型,而且,如有必要,float 類型會隱含轉換成 double。 運算式 的評估方式如下:

  • 如果運算式中具有 double 類型,則運算式會評估為 doublebool (在關聯或相等比較中)。
  • 如果運算式中沒有 double 類型,則運算式會評估為 floatbool (在關聯或相等比較中)。

您可以在運算式中混合使用整數類型和 decimal 類型。 在此情況下,整數類型會隱含地轉換成 decimal 類型,而運算式會評估為 decimalbool (在關聯或相等比較中)。

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

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

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

實數常值

實數常值的類型取決於其後置詞,如下所示:

  • 不含後置詞或具有 dD 後置詞的常值的類型為 double
  • 具有 fF 後置詞的常值的類型為 float
  • 具有 mM 後置詞的常值的類型為 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# 語言規格的下列幾節:

另請參閱