42

为什么需要f在浮点文字中指定后缀?

4

3 回答 3

52

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

来自Java 语言规范,第 3.10.2 节

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

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

于 2012-12-31T14:48:06.703 回答
37

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

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

于 2012-12-31T14:52:52.553 回答
5

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

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

于 2012-12-31T15:20:54.653 回答