为什么显式类型转换需要从double到float而不是从int到byte?

时间:2015-02-06 08:25:21

标签: java casting

请考虑以下声明:

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

为什么编译器在浮点的情况下不为我们进行转换?

4 个答案:

答案 0 :(得分:6)

在整数版本中,编译器知道 all 数字5中的数据可以存储在byte中。没有信息丢失。浮点值并不总是如此。例如,0.1f不等于0.1d

现在您已经给出了示例,小数值5.5 floatdouble中都有完全代表,所以你可以争辩说,在这种情况下,没有信息丢失 - 但语言规范必须使其有效是非常奇怪的:

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类型的文字隐式缩小转换为shortbyte,但对于文字{{1}的转换不会这样做} double的值是Java包含float文字,但不允许使用floatbyte类型的文字。

就个人而言,我真的不喜欢Java的数字转换规则,但是将整数常量存储到shortshort的容差使这些类型至少有点可忍受。