【问题标题】:Java: Why do you need to specify an 'f' in a float literal? [duplicate]Java:为什么需要在浮点文字中指定“f”? [复制]
【发布时间】:2012-12-31 14:47:27
【问题描述】:

为什么需要在浮点字面量中指定后缀f

【问题讨论】:

标签: java floating-point


【解决方案1】:

因为否则默认为double,这是比float更常用的浮点类型。

来自Java Language Specification, section 3.10.2

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

(我个人宁愿没有默认值,以便在所有情况下都清楚,但这是另一回事。)

【讨论】:

  • 但是,如果它默认为不同的类型,为什么还要减速呢?我知道 double 只是一个 64 位浮点数,但这样做有更深层次的理由吗?
  • @stackoverflow:你什么意思? literal 的类型在某种程度上独立于您使用的变量的类型。例如,您可以使用 float 文字并将其分配给 double 变量。在大多数情况下,表达式的类型与使用它的上下文无关。 (在某些情况下会为泛型推断类型,但这是一种特殊情况。)
  • @stackoverflow Java 在将文字分配给原语期间支持narrowing conversion。这就是为什么即使1.0 是双精度的,你也可以拥有float f = 1.0;。我想这是支持的,因为它是明确的 - 例如,与使用方法调用的文字不同。
  • @McDowell,除了 float f = 1.0; 不编译。你需要一个明确的演员:float f = (float) 1.0;.
【解决方案2】:

因为无后缀的浮点字面量是双精度值,而舍入意味着即使是小的字面量在舍入为浮点数和双精度值时也可以采用不同的值。这可以在以下示例中观察到:

float f = (float) 0.67;
if(f == 0.67) 
  System.out.print("yes");
else 
  System.out.print("no");  

这将输出no,因为 0.67 在舍入为浮点数时与舍入为双精度时的值不同。另一方面:

float f = (float) 0.67;
if(f == 0.67f) 
  System.out.print("yes");
else 
  System.out.print("no");

…输出yes

编辑
第二个例子:

if(0.67 == 0.67f) 
  System.out.print("Equal");
else 
  System.out.print("Not Equal");  

…输出Not Equal

【讨论】:

    【解决方案3】:

    有两种浮点类型可以表示为,例如100.0。只有一个可能是默认值。由于精度有限,float 是一种极其特殊的类型。正常情况是双倍,所以它是适当的默认值。

    在现代处理器上,float 和 double 具有相似的计算性能。使用浮点的唯一情况是在需要有限精度的性能关键情况下的大型数组。使用 float 会使适合一个高速缓存行的浮点值的数量加倍。即使这样,确定 float 是否为给定计算提供足够的精度也不是一件容易的事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 2021-01-20
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多