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

why explicit type casting required from double to float but not from int to byte?

考虑以下语句:

byte by = 5; //works fine

文字“5”是 int 类型并且足够小以适合 byte 类型的变量。编译器在这里进行隐式类型转换(从 int 到 byte)。

现在考虑以下场景:

float fl = 5.5;    //compilation error

文字 '5.5' 是双精度类型,也足够小以适合变量 类型浮动。为什么我们需要像这样显式地类型转换:

float fl = (float) 5.5;   //works fine

为什么编译器不为我们进行浮点数转换?

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

现在举个例子,你给出的十进制值 5.5 floatdouble 中都精确表示,所以你可以争论在那种情况下,不会丢失任何信息——但语言规范必须使其有效是很奇怪的:

float f = 5.5;

但这无效:

float f = 5.6;

语言规范很乐意讨论一个数字是否在 float/double 的范围内(尽管 that 不是正如您所期望的那样简单)但是当涉及到是否可以准确表示文字时,我认为 ever 不会详细说明。

答案很简单,因为规范是这么说的(整数类型的编译时常量可以分配给更小的类型,只要它们适合)。

然而,对于浮点数,并不能确定常量是否适合,而是随之而来的精度损失。例如。将 1.23456789123 分配给 double 是可以的,但分配给 float 则不行。不过,在这种情况下,为什么 并不那么明显,至少对某些程序员而言是这样。当 some 浮点常量起作用而其他浮点常量不起作用时,我肯定会认为这是一个惊喜,并且原因不像整数类型那样清楚(其中限制通常是第二位的)大多数人的本性)。

请注意,即使是双打,有时也会丢失信息。您可以根据需要使常量精确,但您不会总是获得变量中指定的准确值。

同意 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

也许最重要的原因是 Java 允许将类型 int 的文字隐式缩小转换为 shortbyte,但不这样做文字 double 值到 float 的转换是 Java 包括 float 文字,但不允许 byteshort 类型的文字。

就个人而言,我真的不喜欢 Java 的数值转换规则,但是允许将整数常量存储到 shortbyte 使得这些类型至少在某种程度上可以忍受。