Java 的 `Double.MIN_VALUE` 可能并不像你想的那样,表示最小值

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位为尾数,或者称有效数字位。

img

由此可见double在计算机中的表示方式和int、long等不同,因此它才可以表示的如此大范围的数。顺带提一句,Double里的最小值是非0非负的最小值,需要最小值只需 -MAX_VALUE即可,负的最大值是-MIN_VALUE。

最后总结:

Double.MIN_VALUE并非是我们所以为的Double所能表示的最小值,而是最小非负值。

参考:

关于Java double取值范围及Double的MAX_VALUE和MIN_VALUE的总结_yangfangjit的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值