关于浮点:Java:为什么需要在float文字中指定’f’?

Java: Why do you need to specify an 'f' in a float literal?

本问题已经有最佳答案,请猛点这里访问。

为什么需要在float文本中指定后缀f


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

从Java语言规范,3.3.2节:

A floating-point literal is of type float if it is suffixed with an ASCII letter F or f; otherwise its type is double and it can optionally be suffixed with an ASCII letter D or d (§4.2.3).

(就我个人而言,我希望没有违约,在所有情况下都要澄清,但这是另一回事。)


因为不固定的浮点文本是双精度的,舍入意味着即使是较小的文本在舍入为浮点和双精度时也可以具有不同的值。这可以在以下示例中观察到:

1
2
3
4
5
float f = (float) 0.67;
if(f == 0.67)
  System.out.print("yes");
else
  System.out.print("no");

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

1
2
3
4
5
float f = (float) 0.67;
if(f == 0.67f)
  System.out.print("yes");
else
  System.out.print("no");

…输出yes

编辑第二个例子:

1
2
3
4
if(0.67 == 0.67f)
  System.out.print("Equal");
else
  System.out.print("Not Equal");


有两种浮点类型可以表示为,例如100.0。只有一个可以是默认值。由于其精度有限,浮点是一种非常专业的类型。正常情况是双精度的,因此它是适当的默认值。

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