Java:为什么需要在float文字中指定'f'?

sta*_*low 40 java floating-point

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

Jon*_*eet 50

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

Java语言规范,第3.10.2节:

如果浮点文字后缀为ASCII字母F或f,则浮点文字的类型为float; 否则其类型为double,并且可以选择以ASCII字母D或d(§4.2.3)为后缀.

(我个人认为没有违约,在所有情况下都要说清楚,但这是另一回事.)

  • @stackoverflow:你是什么意思?*literal* 的类型在某种程度上与您使用的变量类型无关。例如,您可以使用“float”文字并将其分配给“double”变量。在大多数情况下,表达式的类型与其使用的上下文无关。(有些情况下会为泛型推断类型,但这是一种特殊情况。) (2认同)
  • @McDowell,除了 `float f = 1.0;` 不能编译。您需要显式转换:`float f = (float) 1.0;`。 (2认同)

Gri*_*han 34

因为unsuffixed浮点文字是双倍的,并且舍入意味着即使是小文字在舍入为float和double时也可以采用不同的值.这可以在以下示例中观察到:

float f = (float) 0.67;
if(f == 0.67) 
  System.out.print("yes");
else 
  System.out.print("no");  
Run Code Online (Sandbox Code Playgroud)

这将输出no,因为当舍入为浮动时,0.67具有与舍入为double时不同的值.另一方面:

float f = (float) 0.67;
if(f == 0.67f) 
  System.out.print("yes");
else 
  System.out.print("no");
Run Code Online (Sandbox Code Playgroud)

...输出yes.

编辑
第二个例子:

if(0.67 == 0.67f) 
  System.out.print("Equal");
else 
  System.out.print("Not Equal");  
Run Code Online (Sandbox Code Playgroud)


Pat*_*han 5

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

在现代处理器上,float和double具有相似的计算性能。使用浮点数的唯一情况是在要求有限精度的性能至关重要的情况下使用大型数组。使用浮点数会使一个缓存行中的浮点值的数量加倍。即使这样,找出浮点数是否能为给定的计算提供足够的精度仍然很少。