Java 的 Double.MIN_VALUE
可能并不像你想的那样,表示最小值
起因
以往在使用 Integer.MIN_VALUE 时 , 都知道他表示 int 的最小值 。即 -2^31;
因此今天在刷题的时候 ,直接望文生义 以为 Double.MIN_VALUE
同样能表示 double 的最大最小值了。可是,并不是这样…
public static void main(String[] args) {
double min = Double.MIN_VALUE;
if (min > 0) System.out.println(1);
else System.out.println(2);
}
结果 返回了 1
通过源码可知:
/**
* A constant holding the smallest positive nonzero value of type
* {@code double}, 2<sup>-1074</sup>. It is equal to the
* hexadecimal floating-point literal
* {@code 0x0.0000000000001P-1022} and also equal to
* {@code Double.longBitsToDouble(0x1L)}.
*/
public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324
从这里可以知道了 … MIN_VALUE 并不是小于0 的 …
Float呢?
也是一样…
public static void main(String[] args) {
float b = Float.MIN_VALUE;
if (b > 0) System.out.println(1);
else System.out.println(2);
}
/**
* A constant holding the smallest positive nonzero value of type
* {@code float}, 2<sup>-149</sup>. It is equal to the
* hexadecimal floating-point literal {@code 0x0.000002P-126f}
* and also equal to {@code Float.intBitsToFloat(0x1)}.
*/
public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f
根据 IEEE 754 浮点“双精度格式”位布局,返回指定浮点值的表示形式,并保留 NaN 值。 第 63 位(掩码
0x8000000000000000L 选定的位)表示浮点数的符号。第 62-52 位(掩码 0x7ff0000000000000L
选定的位)表示指数。第 51-0 位(掩码 0x000fffffffffffffL 选定的位)表示浮点数的有效数字(有时也称为尾数)。
Java double的表示范围不是-263–(263)-1,同理float。以double为例,最高位为符号位,62-52位为指数位,51-0位为尾数,或者称有效数字位。
由此可见double在计算机中的表示方式和int、long等不同,因此它才可以表示的如此大范围的数。顺带提一句,Double里的最小值是非0非负的最小值,需要最小值只需 -MAX_VALUE即可,负的最大值是-MIN_VALUE。
最后总结:
Double.MIN_VALUE并非是我们所以为的Double所能表示的最小值,而是最小非负值。
参考:
关于Java double取值范围及Double的MAX_VALUE和MIN_VALUE的总结_yangfangjit的博客-CSDN博客