【问题标题】:What do F and D mean at the end of numeric literals?数字文字末尾的 F 和 D 是什么意思?
【发布时间】:2010-12-02 02:42:13
【问题描述】:

我见过一些这样的符号,但我找不到任何奇怪的地方,

double d = 5D;
float f = 3.0F;

5后面的D和F到底是什么意思?

【问题讨论】:

  • 对于那些来自 C 的:1) d 后缀在 ANSI C 中不存在,仅作为 GNU 扩展。 2) 1f 在 C 中是不可能的,你必须使用 1.0f。 3) 对于十六进制整数 literls,df 不起作用,因为它们会与数字本身模棱两可,例如0x1f31,而不是 1.0f
  • 请注意,在带有 GCC 的 C 中,即使 5D 作为整数常量也是无效的; 5.D 可以。 ICC 15 默默地将这些数字视为 0。而使用 tcc 0.9.27,则会出现编译时错误。

标签: java floating-point double


【解决方案1】:

表示这些数字分别是双精度数和浮点数。假设你有

void foo(int x);
void foo(float x);
void foo(double x);

然后你打电话

foo(5)

编译器可能会被难住。这就是为什么你可以说55f5.0来指定类型。

【讨论】:

【解决方案2】:

D代表双

F 表示浮动

你可以在这里阅读java的基本原始类型

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

我想指出写作

5.1D 或 5.1 :如果您没有为逗号数字指定类型字母,那么默认情况下它是双精度的

5 : 没有句点,默认是 int

【讨论】:

    【解决方案3】:

    它们是浮点和双精度字面量的格式说明符。当您编写1.0 时,您是否打算将文字设为浮点数或双精度数是模棱两可的。通过编写1.0f,您是在告诉Java 您打算将文字作为浮点数,而使用1.0d 指定它应该是双精度数。还有L,它代表long(例如,1Llong 1,而不是int 1)

    【讨论】:

    • 澄清一下:它对 javac 没有歧义,只有经验不足的程序员才有可能。 JLS 说没有后缀的1.0 是双精度的。
    【解决方案4】:

    D 代表双精度,F 代表浮点数。您有时需要添加这些修饰符,因为在这种情况下 5 被认为是整数,而 3.0 是双精度数。

    【讨论】:

      【解决方案5】:

      正如其他人所提到的,它们是类型定义,但是您不太可能看到提到 i 或 d,因为它们是默认值。

      float myfloat = 0.5; 
      

      会出错,因为 0.5 默认是双精度,您不能从双精度自动装箱到浮点(64 -> 32 位),但是

      double mydouble = 0.5;
      

      没问题

      【讨论】:

      • "autobox" 是您所描述的错误术语。您的意思是升职的反面,即降职,但没有(自动)规则。
      • 我刚刚参加了 Oracle java SE8 Java 程序员课程,它就在注释中,默认值以及自动装箱/拆箱不会随着精度的降低而发生的事实,因此需要类型定义或强制转换精度降低。作为类型定义
      • Autoboxing/unboxing 发生在一个(或编译器)将原始类型“转换”为其对应的包装类型 int -> Integer 时。你所说的与promotion相反,是的,由于精度损失,没有自动转换。
      【解决方案6】:

      它定义了常量 5 和 3.0 的数据类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 2017-05-16
        • 1970-01-01
        • 1970-01-01
        • 2012-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多