为什么需要从 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 是 在 float
和 double
中都精确表示,所以你可以争论在那种情况下,不会丢失任何信息——但语言规范必须使其有效是很奇怪的:
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
的文字隐式缩小转换为 short
和 byte
,但不这样做文字 double
值到 float
的转换是 Java 包括 float
文字,但不允许 byte
和 short
类型的文字。
就个人而言,我真的不喜欢 Java 的数值转换规则,但是允许将整数常量存储到 short
和 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 是 在 float
和 double
中都精确表示,所以你可以争论在那种情况下,不会丢失任何信息——但语言规范必须使其有效是很奇怪的:
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
的文字隐式缩小转换为 short
和 byte
,但不这样做文字 double
值到 float
的转换是 Java 包括 float
文字,但不允许 byte
和 short
类型的文字。
就个人而言,我真的不喜欢 Java 的数值转换规则,但是允许将整数常量存储到 short
和 byte
使得这些类型至少在某种程度上可以忍受。