代码之家  ›  专栏  ›  技术社区  ›  Xander Luciano

有没有理由在C#中总是声明类型后缀为“f”的浮点?

  •  4
  • Xander Luciano  · 技术社区  · 9 年前

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

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

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

    相关问题: Why Should we use literals in C# Why is the "f" required when declaring floats

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

    4 回复  |  直到 2 年前
        1
  •  3
  •   Decima    9 年前

    这是允许的列表 Implicit Numeric Conversions 。当目标 类型 可以保存原件 类型 范围在这种情况下, float distance = 0.3; 是一个错误,因为浮点范围不能容纳双精度范围。

    关于效率 3 3f ,编译器应该为您进行优化。

    IL_0001:  ldc.r4     3.   // float distance1 = 3;
    IL_0006:  stloc.0
    IL_0007:  ldc.r4     3.   // float distance2 = 3f;
    IL_000c:  stloc.1
    
        2
  •  1
  •   Omnus Ruthius    9 年前

    语用学。f不是必需的。但是,请注意,没有“f”后缀的十进制点号被解释为双精度,这是一种更精确但占用内存的原语。考虑以下内容:

    public float distance = 3.123456789123456;
    

    这个赋值的右边首先被解释,如果没有“f”的含义,它就被视为一个双重赋值。此处将出现编译器错误。因为浮点数不太精确(保留7位小数,而双精度为15位小数),所以您将失去准确性,而变量“距离”现在大约在3.123457左右。

        3
  •  1
  •   sstan    9 年前

    需要 f 后缀在第三个示例中变得很明显:

    public float distance = 0.3f;
    

    如果移除 f 这个 0.3 将被解释为 double 并将生成编译错误,因为 双重的 不能隐式向下转换并分配给 float 变量您需要指定 0.3 在这种情况下是一个浮点文字。

        4
  •  0
  •   i486    9 年前

    如果你写 float dist = 3; 它可以没有 f 。但在你分配 object dist = 3f; 那么你需要 f 因为否则它将被定义为整数。