浮点数值类型

本文介绍了浮点数(float和double)和decimal类型在C#中的特性,包括它们的取值范围、精度、默认值以及在表达式中的混合使用。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 使用 ,因为对于非常大的数据集,4 个字节与 16 个字节之间的差异合乎情理。 有关详细信息,请参阅 System.Decimal。

可在表达式中将整型类型与 和 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);

真实文本

真实文本的类型由其后缀确定,如下所示:
a)不带后缀的文本
b)带有 d 或 D 后缀的文本的类型为 double
c)带有 f 或 F 后缀的文本的类型为 float
d)带有 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;

前面的示例还演示了如何将 _ 用作数字分隔符(从 C# 7.0 开始提供支持)。 可以将数字分隔符用于所有类型的数字文本。

还可以使用科学记数法,即指定真实文本的指数部分,如以下示例所示:

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。 但是,可以使用显式强制转换将任何浮点类型转换为任何其他浮点类型。 有关详细信息,请参阅内置数值转换。

在Java中,`float` 是一种基本数据类型,其值不能为 `null`,只能存储具体的浮点数值,包括正数、负数和零。因此,不能对 `float` 类型变量执行类似 `== null` 的判空操作[^1]。若需要表示可能为空的浮点数值,应使用其包装类 `Float`,因为 `Float` 是引用类型,可以持有 `null` 值。 ### 使用 Float 类型进行判空 如果变量可能表示空值(例如从网络获取的浮点数、数据库查询结果等),应使用 `Float` 类型,并通过 `== null` 进行判空处理: ```java Float value = getWallpaperScale(); // 假设该方法返回 Float 类型 if (value != null) { // 执行操作,例如设置壁纸缩放比例 applyWallpaperScale(value); } else { // 处理 null 的情况,使用默认值或提示信息 useDefaultWallpaperScale(); } ``` ### 使用 float 类型时的替代判空方式 若必须使用 `float` 类型,且需要判断是否为默认值(例如 0.0f),可以通过比较其值是否等于 0.0f 来判断是否“为空”: ```java float value = getWallpaperScale(); // 返回 float 类型 if (value != 0.0f) { applyWallpaperScale(value); } else { useDefaultWallpaperScale(); } ``` 需要注意的是,这种方式仅适用于将 0.0f 视为“空值”的场景,并不适用于所有情况。若需要明确区分“空”与“0”,建议使用 `Float` 类型。 ### 浮点数比较的精度问题 由于浮点数存在精度误差,直接使用 `==` 进行比较可能会导致不准确的结果。因此,在比较浮点数时,应引入一个误差范围(epsilon)进行判断: ```java public static boolean isEqual(float a, float b, float epsilon) { return Math.abs(a - b) < epsilon; } Float value = getWallpaperScale(); if (value != null && isEqual(value, 0.5f, 1e-6f)) { applyWallpaperScale(value); } ``` 这种方式适用于处理动画参数、UI 透明度、传感器数据等涉及浮点运算的场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值