浮点数值类型(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 用于十进制数据时,算术计算中可能会出现意外的舍入错误。 优化doubledecimal性能比确保准确性更重要,而不是使用。 但是,除了计算密集型应用程序,性能方面的任何差异都会被所有应用程序所忽视。 避免 decimal 的另一个可能原因是尽量减少存储要求。 例如, ML.NET 使用 float 是因为 4 个字节和 16 个字节之间的差异会为非常大的数据集相加。 有关详细信息,请参阅 System.Decimal

可以在表达式中混合 整型 类型和 float 类型 double 。 在这种情况下,整型类型将隐式转换为浮点类型之一,如有必要,该 float 类型将隐式转换为 double。 表达式的计算方式如下:

  • 如果表达式中存在 double 类型,则表达式的计算结果 double为或 bool 关系和相等比较。
  • 如果表达式中没有 double 类型,表达式的计算结果 float为或 bool 关系和相等比较。

还可以在表达式中混合整型类型和 decimal 类型。 在这种情况下,整型类型将隐式转换为 decimal 类型,表达式的计算 decimal结果为或 bool 关系和相等比较。

不能将类型 decimalfloat 表达式中的类型和 double 类型混合。 在这种情况下,如果要执行算术、比较或相等运算,则必须从类型或 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# 语言规范的以下部分:

另请参阅