【问题标题】:Why is there a "d" in the definition of Double.NaN = 0.0d / 0.0?为什么 Double.NaN = 0.0d / 0.0 的定义中有一个“d”?
【发布时间】:2017-09-26 15:19:31
【问题描述】:

我刚刚在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.00.0d0.0D

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

public static final double POSITIVE_INFINITY = 1.0 / 0.0;
public static final double NEGATIVE_INFINITY = -1.0 / 0.0;

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

这是故意的还是偶然的?

【问题讨论】:

  • 存在一种可能性,即它只是实施者的防御性编程。从 TODO 和/或注释掉的代码来看,JDK 并不是编程的黄金标准。
  • 也完全有可能这只是一个历史文物(谁知道呢,也许在 Oak 中 0.0 是一个浮点字面值)。
  • @MarkRotteveel 正确,根据this version of the Oak language spec:“2.0f or 2.0F or 2.0 float”。

标签: java


【解决方案1】:

根据Oak language spec,浮点字面量的格式为:

  • 2.0d 或 2.0D 双倍
  • 2.0f 或 2.0F 或 2.0 浮点数

但是这被Java version 1.0改成了熟悉的Java方式

如果浮点字面量以 ASCII 字母 F 或 f 为后缀,则它的类型为 float;否则它的类型是双精度的,并且可以选择以 ASCII 字母 D 或 d 为后缀。

更改可能是为了使其与C-like languages 一致,其中缺少后缀意味着双倍。

所以d 似乎是一个历史遗迹;虽然,在 Oak 规范的链接版本(这是“初步的”)中,有一个边注说 NaN 尚未实现。也许它是在稍晚一点的版本中实现的,并且此后一直保持不变。

(向Mark Rotteveel 提出建议以帮助查找 Oak 语言规范)。

【讨论】:

  • 提醒我下次我需要自己使用 Google ;)
【解决方案2】:

根据语言规范,0.00.0d 相同

JLS Section 3.10.2 对此进行了如下描述:

如果一个浮点字面量以 ASCII 字母 F 或 f;否则它的类型是双重的,它可以 可选地以 ASCII 字母 D 或 d 为后缀

制作文字数字浮点的方法之一是使用“。”在号码中。

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

另一个例子是括号:

 double a = b + c * d;

 double a = b + (c * d);

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

【讨论】:

    【解决方案3】:

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

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

    --Link 由 Andy Turner 发现。

    【讨论】:

      猜你喜欢
      • 2012-02-07
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多