Java: Why do you need to specify an 'f' in a float literal?
为什么需要在float文本中指定后缀f?
- 因为否则,它不会是浮点文字。
- 虽然它是针对C的,但您可能会喜欢这个关于浮点常量微妙之处的测验。我相信这五个问题中的每一个在Java中都会起到同样的作用。blog.frama-c.com/index.php?发布日期:2011/11/08/Floating Point Qu‌&8203;IZ
因为它默认为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).
(就我个人而言,我希望没有违约,在所有情况下都要澄清,但这是另一回事。)
- 但是,如果默认为其他类型,为什么会有一个类型的减速?我知道double只是一个64位的float,但是这样做有更深层次的理由吗?
- @stackoverflow:什么意思?文字的类型在某种程度上独立于所使用的变量类型。例如,您可以使用float字面值,并将其分配给double变量。在大多数情况下,表达式的类型与使用它的上下文无关。(有些情况下会为泛型推断类型,但这是一种特殊情况。)
- "StasObjaveJava"支持在将文本分配给基元时缩小转换。这就是为什么你可以得到float f = 1.0;,即使1.0是一个双份。我想这是受支持的,因为它是明确的-不像在方法调用中使用文字。
- @麦克道尔,除了float f = 1.0;不编译。你需要一个明确的演员表:float f = (float) 1.0;。
因为不固定的浮点文本是双精度的,舍入意味着即使是较小的文本在舍入为浮点和双精度时也可以具有不同的值。这可以在以下示例中观察到:
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是否为给定的计算提供足够的精度也很少是一件小事。