【发布时间】:2020-02-13 19:39:38
【问题描述】:
为什么 char c = 65 工作并且不抛出错误但 float d = 65.0 不工作并抛出静态错误:赋值中的错误类型:从双精度到浮点数?两个人不是很落魄吗?
【问题讨论】:
-
我不确定,但似乎在第一种情况下没有向下转换,因为有符号字符 65 将在范围内 - 127。在第二种情况下,从 double 向下转换为 float,是的
为什么 char c = 65 工作并且不抛出错误但 float d = 65.0 不工作并抛出静态错误:赋值中的错误类型:从双精度到浮点数?两个人不是很落魄吗?
【问题讨论】:
我可以引用 JLS section 5.2 中的内容并说“它的工作原理是这样的,因为语言规范是这样说的”,但这不会令人满意吗?
我对为什么设计这样的语言的有根据的猜测:
将65 转换为char 时,您真正所做的只是在二进制表示中去掉一堆无关紧要的0,因为char 是16 位,而@ 987654328@ 是 32 位的。这就像把 0065 变成 65。
另一方面,65.0 是 double,并以 floating point 格式表示。请注意,通常,这种表示只是真实值的近似值。请参阅this post 了解更多信息。位数越多,近似值越好。因此,从double(64 位)转换为float(32 位)有点像将 0.333333 转换为 0.333。希望您同意这比将 0065 变为 65 损失的信息更大。因此,这不是应该自动执行的转换。程序员需要意识到这种情况正在发生。
无论如何,为了完整起见,这是语言规范的相关部分:
分配上下文允许使用以下之一:
...
此外,如果表达式是
byte、short、char或int类型的常量表达式(第 15.28 节):
- 如果变量的类型是 byte、short 或 char,并且常量表达式的值可以用变量的类型表示,则可以使用缩小原语转换。
因此语言规范对 byte、short、char 和 int 进行了特殊处理,允许它们在赋值上下文中进行缩小转换。请注意,表达式必须是:
char x = 100000;无效。【讨论】:
float d = 65.0;
65.0 不是浮点值。 这是一个双重价值。 输入浮点值时,数字必须以字母 f 结尾。
你看这里。
float d = 65.0f;
如果您想将 d 设为 65 而不必写字母 f,您可以执行以下操作。
float d = (float)65.0;
这被称为窄铸造。
【讨论】:
65.0 在 Java 意义上是双精度的,因为 .。如果您希望此数字为浮点数,只需在其后面添加f。
float d = 65.0f
【讨论】: