为什么Double.NaN = 0.0d / 0.0的定义中有“d”?
我刚刚在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.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的第一部分?
这是故意的还是偶然的?
根据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尚未实现。 也许它是在稍后的版本中实现的,并且在之后永远保持不变。
(道具指向Mark Rotteveel轻推查找Oak语言规范)。
根据语言规范, 0.0
与0.0d
相同
JLS第3.10.2节描述如下:
如果浮点文字后缀为ASCII字母F或f,则浮点文字的类型为float; 否则其类型为double,并且可以选择以ASCII字母D或d为后缀
制作文字数浮点的方法之一是使用’。’ 在号码。
作者使用d
后缀的原因尚不清楚。 但通常这是为了增加清晰度或减少读者在理解此代码时所需的工作量。 某些人可能知道这些规则,但不是每个人都知道。 其他语言的默认值也可能不同。 因此,在许多情况下,编写更详细的版本更好。
另一个例子是圆括号:
double a = b + c * d;
VS
double a = b + (c * d);
我更喜欢带括号的那个,因为它更容易阅读(即使所有程序员都知道它们是相同的)。
0.0
和0.0d
之间没有区别,因为Java默认使用双精度来表示浮点数。
尽管如此,代码在许多语言中更具可读性, float
是默认的,而后来在Oak中 演变为Java,因此它看起来像历史问题。
– 安迪特纳发现的链接。