假设我有一个带有一些随机较大值double类型的变量:
double d = 4786777867867868654674678346734763478673478654478967.77;
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试在程序中的某个点将其转换为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
Run Code Online (Sandbox Code Playgroud)
有人可以给我任何有效的答案,它是如何不仅仅为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);
Run Code Online (Sandbox Code Playgroud)
输出:
float Infinity
long 9223372036854775807
int 2147483647
short -1
byte -1
Run Code Online (Sandbox Code Playgroud)
浮动
来自JLS:
从double到float的缩小基元转换由IEEE 754舍入规则(第4.2.4节)控制.这种转换可能会失去精度,但也会失去范围,导致从非零双精度浮点零和从有限双精度浮点无穷大.
基本上,IEEE 754强制要求这种行为.IEEE 754预留了一个特定的位模式来表示无穷大,并且定义了涉及该值的所有浮点运算.
Long&Int
JLS声明,如果缩小基元转换double为long或者int,如果值太大而不适合该范围(64或32位有符号整数),则应使用最大的可表示值, Long.MAX_VALUE并且Integer.MAX_VALUE;
短和字节
在浇铸double到一个short或byte,数首先被浇铸到一个int,使用上面的规则.它然后从铸造int到short或byte通过丢弃所有,但n(16最低位short为,8 byte).由于除了高位之外的所有位Integer.MAX_VALUE都被设置为1,因此short和byte值都设置了所有位,这对应于带符号二进制补码中的-1.
| 归档时间: |
|
| 查看次数: |
526 次 |
| 最近记录: |