浮点数值类型(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 常量,提供该类型的最小值和最大有限值。 float and double 类型还提供可表示非数字和无穷大值的常量。 例如,double 类型提供以下常量:Double.NaNDouble.NegativeInfinityDouble.PositiveInfinity

当所需的精度由小数点右侧的位数决定时,decimal 类型是合适的。 此类数字通常用于财务应用程序、货币金额(例如 $1.00)、利率(例如 2.625%)等。 精确到只有一个小数的偶数用 decimal 类型处理会更准确:例如,0.1 可以由 decimal 实例精确表示,而没有精确表示 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# 语言规范的以下部分:

另请参阅