Java - 为什么将 F 附加到 `float a=0.32F` 告诉它在 a 中存储 32 位浮点数,而执行 `float a = 0.32` 告诉它您要存储 64 位双精度数?

Java - Why does append F to `float a=0.32F` tell it to store 32-bit float in a, but doing `float a = 0.32` tell it you want to store 64 bit double?

我正在研究 Bart Baesens、Aimee Backiel 和 Steppe vanden Broucke 的 "Beginning Java Programming"。

我说的是在将文字分配给标识符时附加和不附加字母之间的区别。例如:

float ratio = 0.234

相比于:

float ratio = 0.234F

在我正在查看的页面上(我在书中的其他任何地方都看不到说明)根本没有帮助。

谷歌搜索导致许多不太清楚的答案。我确实在 Quora 上找到了以下答案:

当口译员看到float ratio = 0.234; 它知道 float 是什么意思,因为它是一个保留关键字 它推断比率是一个标识符 = 是赋值运算符 0.234 是双字面量和 ;是分隔符 因为这就是语言的定义方式。所以该语句在语法上是正确的,但是当语义检查开始时,它发现您正在尝试将 64 位双精度文字存储到 32 位浮点变量中,这将导致精度损失,因此它会给您一个错误或警告.

但是为什么 float ratio = 0.234 会让它认为我想将 64 位双精度字面值赋值给 32 位浮点变量?我是说。我实际上是在告诉它我想要一个浮点数,所以一定还有另一个我失踪的原因。

没有前缀的浮点文字被解释为 64 位 double 文字。这就是 Java 语言的定义方式。不允许尝试将 double 文字存储在 float 变量中(因为它可能需要失去精度的类型转换)。

0.234 在您看来可能喜欢可以存储在 float 变量中的值,但编译器将其解释为 64 位值,因此尝试将其存储在 32 位变量中-bit 变量需要进行可能会丢失精度的转换。

当你给浮点字面量添加 f(或 F)后缀时,编译器知道它应该被解释为一个 32 位值,它可以存储在一个 float变量。

这里的 32/64 讨论涉及文字,而不是变量。 0.234F 是 32 位浮点文字,而 0.234 是 64 位双精度文字。

因此,如果我们重新检查这两个陈述:

float ratio = 0.234F 表示 "take the 32bit float value of 0.234 and place it in the variable ratio".
float ratio = 0.234 表示 "take the 64bit double value of 0.234 and place it in the variable ratio" - 如您所见,这是不可能的并会导致编译错误。

A double 使用的 space 比 Java 中的 float 多。与浮点数据类型的 32 位存储相比,双精度数需要 64 位存储。

默认情况下,浮点数在 Java 中是双精度的。

例如: 如果您在 ide 和 IDE 中键入 float y = 394.04;,它会告诉您不能将 394.04 分配给浮点数,这是因为它是双字面值。

要将其显式转换为浮点数,您可以添加 f 作为后缀。例如 float y = 394.04f

A double 数据类型比 float 更精确。双精度变量可以提供高达 15 到 16 位小数点的精度,而浮点精度为 6 到 7 位小数位,为此它需要更多 space 内存。

编译器在解析语言时做两件事,第一个是语法检查,第二个是语义检查。 让我们考虑 ratio = 0.234;,因为变量是比率 = 是赋值,0.234 是 64 位的双精度类型,最后 ; 是定界符,但对于 ratio = 0.234F发生语义检查尝试以 32 位存储 64。