繁体   English   中英

Java:d​​ouble to float类型转换为更大的值赋予'infinity'

[英]Java : double to float type conversion is giving 'infinity' for larger values

假设我有一个带有一些随机较大值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数据类型转换?

让我们看看将这个大型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预留了一个特定的位模式来表示无穷大,并且定义了涉及该值的所有浮点运算。

Long&Int

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

短和字节

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

浮动范围从1.40129846432481707e-45到3.40282346638528860e + 38。

双值不适合它。 Java规范还说:

这种转换可能会失去精度,但也会失去范围,导致从非零双精度浮点零和从有限双精度浮点无穷大。

Double是64位,float是32位。 并非所有双打都适合漂浮。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM