是否有理由在 C# 中始终声明类型后缀为“f”的浮点数

本文关键字:后缀 浮点数 类型 声明 有理由 是否 | 更新日期: 2023-09-27 18:34:33

创建浮点变量时,整数不需要类型后缀,即所有这些都是有效的:

public float distance = 3;
public float distance = 3f;
public float distance = 0.3f;

有理由使用3f而不是3吗?编译器是否足够智能,可以将类型识别为 float 并自动强制转换它?

相关问题:为什么我们应该在 C# 中使用文字以及为什么在声明浮点数时需要"f">

两者都解释了为什么我们需要使用类型后缀"f",但是有没有一种"正确"的方式来声明具有整数值的浮点数?一种方式更有效吗?

是否有理由在 C# 中始终声明类型后缀为“f”的浮点数

下面是允许的隐式数字转换列表。 当目标类型可以保存原始类型范围时,允许隐式转换。 在这种情况下,float distance = 0.3;是一个错误,因为浮点范围无法容纳双精度范围。

至于效率,在33f之间,编译器应该为您优化。

IL_0001:  ldc.r4     3.   // float distance1 = 3;
IL_0006:  stloc.0
IL_0007:  ldc.r4     3.   // float distance2 = 3f;
IL_000c:  stloc.1

Pragmatics。f 不是必需的。但是,请注意,没有"f"后缀的小数点数被解释为双精度,这是一种更精确但内存昂贵的基元。请考虑以下事项:

public float distance = 3.123456789123456;

这个赋值的右手首先被解释,没有"f"的内涵,它被认为是一个双倍。此处会发生编译器错误。由于浮点数不太精确(保持 7 位小数,而双精度为 15(,您将失去准确性,变量"距离"现在将在 3.123457 左右

第三个示例中,对f后缀的需求变得很明显:

public float distance = 0.3f;

如果删除f0.3将被解释为double并生成编译错误,因为double不能隐式向下转换并分配给float变量。 在这种情况下,您需要指定0.3是浮点文本。

如果你

float dist = 3;它可以没有f .但是在你分配object dist = 3f;时,你需要f,否则它将被定义为整数。