为什么Double.NaN = 0.0d/0.0的定义中有"d"?

kav*_*i77 27 java

我刚刚看到了NaNin 的定义Double.class.它说:

 /**
   * A constant holding a Not-a-Number (NaN) value of type
   * {@code double}. It is equivalent to the value returned by
   * {@code Double.longBitsToDouble(0x7ff8000000000000L)}.
   */
  public static final double NaN = 0.0d / 0.0;
Run Code Online (Sandbox Code Playgroud)

我知道,根据Java规范这些文字代表了同一个号码:0.0,0.0d,和0.0D.

另外对于其他常量,他们没有使用'd'后缀:

public static final double POSITIVE_INFINITY = 1.0 / 0.0;
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
Run Code Online (Sandbox Code Playgroud)

为什么他们需要在NaN定义中将后缀d写入0.0的第一部分?

这是故意的还是偶然的?

And*_*ner 28

根据Oak语言规范,浮点文字的格式为:

  • 2.0d或2.0D双倍
  • 2.0f或2.0F或2.0浮动

但这已经改为Java版1.0的熟悉的Java方式

如果浮点文字后缀为ASCII字母F或f,则浮点文字的类型为float; 否则其类型为double,并且可以选择以ASCII字母D或d为后缀.

这种变化可能是为了使其与类C语言保持一致,缺少后缀意味着双重语言.

所以这d似乎是一个历史遗迹; 虽然,在Oak规范的链接版本(这是"初步")中,有一个保证金说明NaN尚未实施.也许它是在稍后的版本中实现的,并且在之后永远保持不变.

(马克·罗特维尔的道具推动查找橡树语言规范).

  • 提醒我,下次我需要自己使用谷歌;) (7认同)

Thi*_*ler 8

根据语言规范,0.0是一样的0.0d

JLS第3.10.2节描述如下:

如果浮点文字后缀为ASCII字母F或f,则浮点文字的类型为float; 否则其类型为double,并且可以选择以ASCII字母D或d为后缀

制作文字数字浮点的方法之一是使用'.' 在号码.

作者使用d后缀的原因尚不清楚.但通常这是为了增加清晰度或减少读者在理解此代码时所需的工作量.某些人可能知道这些规则,但不是每个人都知道.其他语言的默认值也可能不同.因此,在许多情况下,编写更详细的版本会更好.

另一个例子是圆括号:

 double a = b + c * d;
Run Code Online (Sandbox Code Playgroud)

VS

 double a = b + (c * d);
Run Code Online (Sandbox Code Playgroud)

我更喜欢带括号的那个,因为它更容易阅读(即使所有程序员都知道它们是相同的).


xen*_*ros 6

两者之间没有区别0.0,0.0d因为Java默认使用双精度来表示浮点数.

尽管如此,代码在许多语言中更具可读性,float是默认的,以及后来在Oak中 演变为Java,因此它看起来像历史问题.

- 安迪特纳发现的链接.