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