请考虑以下声明:
byte by = 5; //works fine
字面' 5'是int类型,小到足以适合byte类型的变量。编译器在这里执行隐式类型转换(从int到byte)。
现在考虑以下情况:
float fl = 5.5; //compilation error
字面' 5.5'是double类型,也小到足以适应变量 键入float。为什么我们需要像这样明确地输入:
float fl = (float) 5.5; //works fine
为什么编译器在浮点的情况下不为我们进行转换?
答案 0 :(得分:6)
在整数版本中,编译器知道 all 数字5
中的数据可以存储在byte
中。没有信息丢失。浮点值并不总是如此。例如,0.1f
不等于0.1d
。
现在您已经给出了示例,小数值5.5 在float
和double
中都有完全代表,所以你可以争辩说,在这种情况下,没有信息丢失 - 但语言规范必须使其有效是非常奇怪的:
float f = 5.5;
但是这个无效:
float f = 5.6;
语言规范很高兴谈论一个数字是否符合float
/ double
的范围(尽管 并不像您预期的那样简单)但是当谈到文字是否可以准确表示时,我认为永远不会进入细节。
答案 1 :(得分:2)
简单的答案是,因为规范是这样说的(只要它们适合,就可以将整数类型的编译时常量分配给较小的类型。)
然而,对于浮点,没有太多决定常数是否适合,而是随之而来的精度损失。例如。将1.23456789123分配给double是正常的,但是对于float不是。在这种情况下,为什么并不是那么明显,至少对一些程序员而言。当某些浮点常量起作用而其他浮点常数不起作用时,我肯定会将其视为一个惊喜,其原因并不像整数类型那样明显(其中限制通常是第二天性的) )。
请注意,即使有双打,有时也会丢失信息。您可以根据需要使常量精确,但不会总是得到您在变量中声明的确切值。
答案 2 :(得分:0)
同意Jon,但是,我想补充一下
byte by = 5; //works fine until the number is less than 128
这是因为一个字节最多只能容纳-128到127.一旦你尝试输入127以上的数字,就会得到与将double值存入float时相同的错误。
byte by = 128; //compilation error
因此,为了同意丢失转换数据,您需要执行显式转换。
byte by = (byte) 128; // work fine
答案 3 :(得分:0)
也许最重要的原因是Java允许将int
类型的文字隐式缩小转换为short
和byte
,但对于文字{{1}的转换不会这样做} double
的值是Java包含float
文字,但不允许使用float
和byte
类型的文字。
就个人而言,我真的不喜欢Java的数字转换规则,但是将整数常量存储到short
和short
的容差使这些类型至少有点可忍受。