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

标签 java

假设我有一个变量,其中包含一些 double 类型的随机较大值:

double d = 4786777867867868654674678346734763478673478654478967.77;

现在,如果我尝试在我的程序中的某个时刻将其转换为 float ,输出将显示“无穷大”(在 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

float

来自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 指出,在从 doublelongint 的缩小原始转换的情况下,值太大而无法适合范围(64 或 32 位带符号整数),应使用最大可表示值,Long.MAX_VALUEInteger.MAX_VALUE;

短&字节

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

关于Java : double to float type conversion is giving 'infinity' for larger values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52398406/

相关文章:

java - 有没有办法在 public static void main(string args[]) 中不使用 static ?

java - Tomcat 服务器和 HTTP 客户端接受过期的自签名证书

java - 原始 Servlet 与 Spring MVC

Java - SonarQube,在 'Utility classes should not have public constructors' 上发布(squid :S1118) in singleton

java - 如何从 Java 中的 ArrayList 中删除除第一个元素之外的所有内容

javascript 无法与 java 中的 printwriter 一起使用

java - 加载 Java 消息属性以进行内部化

java - 应用程序卡在 hibernate 状态 txOracle.commit();

java - 在 Spring Boot 中重定向到不同的主机(非 www 到 www URL)

java - 使用java map /列表按相似结构分组