Java:为什么需要指定一个';f';在浮点文本中?

Java:为什么需要指定一个';f';在浮点文本中?,java,floating-point,Java,Floating Point,为什么需要在浮点文本中指定后缀f 因为否则它默认为double,这是一种比float更常用的浮点类型 从: 如果浮点文字的后缀为ASCII字母F或F,则它的类型为float;否则,其类型为双精度,并且可以选择使用ASCII字母D或D作为后缀(§4.2.3) (就我个人而言,我希望在所有情况下都没有默认值,但这是另一回事。)因为无固定浮点文字是双精度的,舍入意味着即使是小的文字在舍入为浮点和双精度时也可以采用不同的值。这可以在以下示例中观察到: float f = (float) 0.67; if

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

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

从:

如果浮点文字的后缀为ASCII字母F或F,则它的类型为float;否则,其类型为双精度,并且可以选择使用ASCII字母D或D作为后缀(§4.2.3)


(就我个人而言,我希望在所有情况下都没有默认值,但这是另一回事。)

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

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");
…输出

编辑
第二个例子:

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

…输出
不相等

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


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

因为否则,它将不是浮点文字。虽然它是针对C的,但您可能会喜欢这个关于浮点常量细节的测验。我相信这五个问题在Java中的作用完全相同。但是,如果一种类型默认为另一种类型,那么为什么会有一种类型的减速呢?我理解double只是一个64位浮点,但这样做有更深层次的理由吗?@stackoverflow:你是什么意思?文本的类型在某种程度上独立于您使用的变量的类型。例如,可以使用
float
literal并将其分配给
double
变量。在大多数情况下,表达式的类型独立于使用它的上下文。(有些情况下会为泛型推断类型,但这是一种特殊情况。)@stackoverflow Java在将文本分配给原语时提供支持。这就是为什么您可以使用
float f=1.0即使
1.0
是双精度的。我想这是受支持的,因为它是明确无误的-不像在方法调用中使用文本,例如@McDowell,除了
float f=1.0不编译。您需要显式转换:
float f=(float)1.0