加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 08:27:23 所属栏目:Java 来源:网络整理
导读:假设我有一个带有一些随机较大值double类型的变量: double d = 4786777867867868654674678346734763478673478654478967.77; 现在,如果我尝试在程序中的某个点将其转换为float,则输出显示“infinity”(在eclipse IDE中): float f = (float)d; // inifintyby
假设我有一个带有一些随机较大值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  %fn",(float)d);
    System.out.printf("long   %dn",(long)d);
    System.out.printf("int    %dn",(int)d);
    System.out.printf("short  %dn",(short)d);
    System.out.printf("byte   %dn",(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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读