Java—为什么在'float a=0.32F'后面附加F会告诉它在a中存储32位浮点,而执行'float a=0.32'会告诉它要存储64位双精度浮点?

Java—为什么在'float a=0.32F'后面附加F会告诉它在a中存储32位浮点,而执行'float a=0.32'会告诉它要存储64位双精度浮点?,java,variables,variable-assignment,literals,identifier,Java,Variables,Variable Assignment,Literals,Identifier,我正在学习Bart Baesens、Aimee Backiel和Spreade vanden Broucke的“开始Java编程” 我要说的是,在给标识符赋值时,加字母和不加字母的区别。例: 浮动比率=0.234 与之相比: float ratio=0.234F 在我看到的页面上(我看不到书中其他任何地方的澄清),这一点都没有帮助 谷歌搜索的结果是许多不太清楚的答案。我确实在Quora上找到了以下答案: " 当解释器看到浮动比率=0.234; 它知道float的含义,因为它是一个保留关键字 它推

我正在学习Bart Baesens、Aimee Backiel和Spreade vanden Broucke的“开始Java编程”

我要说的是,在给标识符赋值时,加字母和不加字母的区别。例:

浮动比率=0.234

与之相比:

float ratio=0.234F

在我看到的页面上(我看不到书中其他任何地方的澄清),这一点都没有帮助

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

" 当解释器看到
浮动比率=0.234;
它知道float的含义,因为它是一个保留关键字 它推断比率是一个标识符 =是赋值运算符 0.234是一个双字面值和 ;是分隔符 因为这正是语言的定义方式。因此,该语句在语法上是正确的,但当语义检查开始时,它会看到您试图将64位双文本存储到32位浮点变量中,这将导致精度损失,因此它会给您一个错误或警告。 "


但是为什么做
float ratio=0.234
会让它认为我想把一个64位双字面值赋给一个32位浮点变量呢?我是说。我实际上是在告诉它我想要一个浮动,所以肯定还有另一个我错过的原因

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

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


当您将
f
(或
f
)后缀添加到浮点文本中时,编译器知道应该将其解释为32位值,该值可以存储在
float
变量中。

此处的32/64讨论与文本相关,而不是与变量相关。
0.234F
是32位浮点文本,而
0.234
是64位双精度文本

因此,如果我们重新审视这两种说法:

float ratio=0.234F
表示“取0.234的32位浮点值,并将其放入变量
ratio


float ratio=0.234
意味着“取0.234的64位双精度值,并将其放入变量
ratio
”——正如您所看到的,这是不可能的,并且会导致编译错误。

a
double
比Java中的
float
使用更多的空间。与浮点数据类型的32位存储相比,double需要64位存储

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

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


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

编译器在解析语言时要做两件事,第一件是语法检查,第二件是语义检查。
让我们考虑<代码>比率=0.234;<该变量中的code>是比率
=
是赋值,
0.234
是双精度类型,即64位,最后是
是分隔符,但对于
ratio=0.234F
语义检查,请尝试将64位存储在32位。

0.234F
是一个
float
文本,
0.234
是一个
文本
234
int
文本,
234L
long
文本。不管是好是坏,事情就是这样……你认为
double d=0.234
浮动f=0.234是什么?你认为它们是一样的吗?也许有助于阅读本教程:所以本质上,这就是Java的工作方式,我没有遗漏什么?例如,当您将0.234分配给某个对象时,除非您附加其中一个字母来告诉它应该是什么,否则0.234将始终被视为双精度?@JackW它将是双精度的,除非您附加f/f后缀或显式将其强制转换为
float
(即
float x=(float)0.234;
)谢谢您的帮助谢谢,这是一个好的,简洁明了的回答。但在我看来这确实很奇怪。我是编程新手,所以可能是我缺乏知识。。。但在我看来,如果我有
float ratio=0.234
,那么语言应该设计成查看变量的类型,以确定文本是什么。但我相信这是有原因的,我不知道yet@JackW另一种方法是,文本具有类型,而不管其上下文如何
0.234
是一个
double
,就像
“hello world”
是一个字符串一样。在可以进行隐式(加宽)转换的情况下,Java将隐式地为您进行转换(例如,
long mylong=123;
)。如果不是,则会出错。这是Java的表达方式,“嘿,你正试图将64位双精度赋值给32位浮点,可能会失去一些精度。你确定要这样做吗?”好吧,那我就明白了。所以,您是否建议我在为标识符分配文本时总是附加这些字母?例如,我是否应该始终执行
float a=0.334F
(与其他类型类似)?@JackW yes。不