[英]Double.POSITIVE_INFINITY == Float.POSITIVE_INFINITY
我试过
System.out.println(Double.isInfinite(Float.POSITIVE_INFINITY))
System.out.println(Double.isInfinite(Float.NEGATIVE_INFINITY));
output 是
true
true
那么这意味着两种数据类型的“无穷大”是一样的吗?
是和不是。 是的,因为在抽象意义上无限就是无限(而且,正如我在下面解释的那样,出于大多数代码的目的,浮点数无论如何都会转换为双精度数)。
但是,不,因为在位级别上,两个无穷大是不同的。 double 在 Java 中是 64 位,而 float 在 Java 中是 32 位,所以它们在表示级别上是不同的。
在 Java 中,浮点数(浮点数和双精度数)使用IEEE 754浮点格式表示,这是当今几乎每个人都使用的标准。 每个数字都以二进制表示为一个符号位,加上一定数量的指数位,再加上一定数量的尾数(尾数)位。 在 float 或 double 中,正无穷大用符号位 0 表示,指数位全 1,尾数位全 0。负无穷大的表示方式相同,只是符号位为 1。所以无穷大表示为两种非常相似的方式,但由于浮点数和双精度数之间的指数和尾数位的计数不同,因此位级模式不同。
出于编写代码的目的,您可以将它们视为相同。 每当您同时使用双精度数和浮点数时,除非您明确说明,否则浮点数将自动转换为双精度数并且表达式将生成双精度数,因此对于大多数实际用途而言,浮点数无穷大“表现得像”双精度无穷大。
这取决于你所说的“相同”是什么意思。 位模式不同,因为符号不同,但它们仍然是无限的。
此外,浮点数的提升规则在转换为双精度数时将保留无限性质。
在 Java 中,您不能直接将double
与float
进行比较。 相反,当您尝试这样做时, float
首先会自动转换为double
精度数。 当您将float
传递给采用double
参数的方法时,也会发生同样的事情。 当您将Float.POSITIVE_INFINITY
(例如)转换为double
时,您会得到Double.POSITIVE_INFINITY
。
所以你的问题的答案是Double.POSITIVE_INFINITY
和Float.POSITIVE_INFINITY
并不完全相同,但它们都表示“一个太大而无法表示的数字”,因此==
给你的答案在逻辑上是一致的。
没有办法比较 Java 中的float
和double
精度数。 在将float
隐含地向上转换为double
后,您可能使用的所有操作都将double
与double
进行比较
float f=
double d =
Double.compare(f, d);
// equivelent to
Double.compare((double) f, d);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.