Java:双精度浮点数类型转换为较大的值提供了“无穷大”

时间:2018-09-19 05:01:59

标签: java

假设我有一个带有一些double型随机较大值的变量:

double d = 4786777867867868654674678346734763478673478654478967.77;

现在,如果我尝试在程序中的某个点将其转换为float,输出将显示“ infinity”(在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数据类型转换?

3 个答案:

答案 0 :(得分:6)

让我们看一下将如此大的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

浮动

来自JLS

  

从double到float的原始转换越来越严格,受以下因素控制:   IEEE 754舍入规则(第4.2.4节)。这种转换可能会失败   精度,但也会丢失范围,导致从   非零双精度数和有限双精度数的浮动无穷大

基本上,IEEE 754强制执行此行为。 IEEE 754预留了一个特定的位模式来表示无穷大,并定义了涉及该值的所有浮点运算。

长整数

JLS指出,在从doublelongint的原始转换变窄的情况下,该值太大而无法容纳该范围(64或32位)有符号整数),则应使用可表示的最大值Long.MAX_VALUEInteger.MAX_VALUE;

短字节

在将double强制转换为shortbyte时,首先使用上述规则将数字强制转换为int。然后通过丢弃除int最低位以外的所有其他位(short为16,byte为8)将其从n投射到shortbyte )。由于Integer.MAX_VALUE的除高位以外的所有位都设置为1,因此shortbyte的值均已设置为所有位,这与带符号的二进制补码中的-1相对应。

答案 1 :(得分:1)

浮动范围是1.40129846432481707e-45至3.40282346638528860e + 38。

双精度值不能容纳在其中。 Java规范还说:

  

此转换可能会失去精度,但也会失去范围,导致非零双精度浮点为零,而有限双精度浮点为无穷大。

答案 2 :(得分:0)

双精度为64位,浮点为32位。并非所有的双打都适合浮动。