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。
我正在研究 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。