i刚刚在 Double.class
中遇到了 NaN
的定义。它说:
/**
* 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;
我知道,根据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;
为什么他们需要在NAN定义中将后缀D写成0.0的第一部分?
这是故意的还是偶然的?
根据橡木语言规范,浮点文字的格式为:
- 2.0D或2.0D Double
- 2.0f或2.0f或2.0 float
但这更改为Java版本1.0
的熟悉的Java方式如果浮点字体的字体为float类型,如果用ascii字母f或f后缀;否则,它的类型是双重的,并且可以选择用ASCII字母D或D。
更改也许是为了使其与类似C的语言一致,因为缺乏后缀意味着双重。
因此,d
似乎是历史文物。尽管在Oak规格的链接版本("初步")中,有一个保证金说明NAN尚未实施。也许它是在稍后的版本中实现的,并且在此之后永远保持不变。
(标记Rotteveel的Props,以查找橡木语言规格)。
根据语言规范, 0.0
与 0.0d
JLS第3.10.2节将其描述如下:
浮点字面的字面形式为浮点 ASCII字母f或f;否则它的类型是双重的,可以 可选地用ASCII字母D或D
将其装饰
制作字面数字浮点的方法之一是使用'。在数字中。
为什么不知道作者使用d
后缀。但这通常是为了增加清晰度或减少读者理解此代码所需的努力。某些人可能知道这些规则,但对每个人都不知道。对于其他语言,默认值也可能有所不同。因此,在许多情况下,编写更多的详细版本更好。
另一个例子是括号:
double a = b + c * d;
vs
double a = b + (c * d);
我更喜欢括号的那个,因为它更容易阅读(即使所有程序员都知道他们是平等的)。
0.0
和0.0d
之间没有区别
仍然,该代码在许多语言中都可以读取, float
是默认值,而在oak 中又是后来演变为Java ,因此看起来像历史问题。
- 安迪·特纳(Andy Turner)找到的链接。