假设我有一个变量,其中包含一些 double 类型的随机较大值:
double d = 4786777867867868654674678346734763478673478654478967.77;
现在,如果我尝试在我的程序中的某个时刻将其转换为 float ,输出将显示“无穷大”(在 eclipse IDE 中):
float f = (float)d; // inifinty
byte b = (byte)d; // some valid value
short s = (short)d; // some valid value
int i = (int)d; // some valid value
谁能给我任何有效的答案,它为什么不转换为仅 float 据类型?
最佳答案
让我们看一下将这个大的 double
转换为每个其他数字基本类型的结果:
double d = 4786777867867868654674678346734763478673478654478967.77;
System.out.printf("float %f\n", (float)d);
System.out.printf("long %d\n", (long)d);
System.out.printf("int %d\n", (int)d);
System.out.printf("short %d\n", (short)d);
System.out.printf("byte %d\n", (byte)d);
输出:
float Infinity
long 9223372036854775807
int 2147483647
short -1
byte -1
float
来自JLS :
A narrowing primitive conversion from double to float is governed by the IEEE 754 rounding rules (§4.2.4). This conversion can lose precision, but also lose range, resulting in a float zero from a nonzero double and a float infinity from a finite double.
基本上,IEEE 754 规定了这种行为。 IEEE 754 预留了一个特定的位模式来表示无穷大,并且定义了所有涉及该值的浮点运算。
长整型
JLS 指出,在从 double
到 long
或 int
的缩小原始转换的情况下,值太大而无法适合范围(64 或 32 位带符号整数),应使用最大可表示值,Long.MAX_VALUE
和 Integer.MAX_VALUE
;
短&字节
在将 double
转换为 short
或 byte
时,首先将数字转换为 int
,使用上面的规则。然后通过丢弃除 n
最低位以外的所有位(16 位 short
,8 表示 byte
)。由于 Integer.MAX_VALUE
的高位以外的所有位都设置为 1,因此 short
和 byte
值的所有位都已设置,对应于 - 1 有符号二进制补码。
关于Java : double to float type conversion is giving 'infinity' for larger values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52398406/