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 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:
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,对于字节为8),将其从int转换为short或byte.由于除Integer.MAX_VALUE的高位之外的所有位都设置为1,因此短值和字节值都设置了所有位,对应于带符号二进制补码中的-1.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。