浮点数值类型表示实数。 所有浮点数值类型都是 值类型。 它们也是 简单的类型 ,可以使用 文本进行初始化。 所有浮点数值类型都支持 算术、 比较和 相等 运算符。
浮点类型的特征
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
和 double
类型还提供表示非数字值和无穷大值的常量。 例如,该 double
类型提供以下常量: Double.NaN、 Double.NegativeInfinity和 Double.PositiveInfinity。
当所需的精度程度由小数点右侧的数字数确定时,该 decimal
类型是合适的。 此类数字通常用于金融应用程序、货币金额(例如 1.00 美元)、利率(例如 2.625%),等等。 即使是精确到一个十进制数字的数字也更准确地按decimal
类型进行处理:例如,0.1 可以完全由decimal
实例表示,而没有double
float
或完全表示 0.1 的实例。 由于数值类型存在这种差异,因此使用 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# 语言规范的以下部分: