为什么Java中的Float.MIN_VALUE是正值?

Ily*_*man 6 java floating-point

您认为Float.MIN_VALUE等于什么?

下一个代码解释了我过去5个小时的去向,尝试解决一个错误.

public static void main(String[] args) {
    compareToZero(Float.MIN_VALUE); // Out = true false false
    compareToZero(Float.MAX_VALUE); // Out = true false false

    System.out.println("Float minimum " + Float.MIN_VALUE); // Out = 1.4E-45
    System.out.println("Float maximum " + Float.MAX_VALUE); // Out = 3.4028235E38
}

private static void compareToZero(float value1) {
    System.out.print((value1 > 0) + " ");
    System.out.print((value1 < 0) + " ");
    System.out.print((value1 == 0) + "\n");
}
Run Code Online (Sandbox Code Playgroud)

我没想到浮点数的最小值将是正值...找不到任何用途.

小智 17

根据Float.MIN_VALUE的文档:

保持float类型的最小正非零值的常量,2-149.它等于十六进制浮点字面值0x0.000002P-126f,也等于Float.intBitsToFloat(0x1).

虽然名称是值得商榷的"真正的最小值"的float-Float.MAX_VALUE,我怀疑MIN_VALUE被选中的一致性与其他数字类型.使用名称MIN_RANGE_VALUEMAX_RANGE_VALUE(或类似)可能会使差异更加清晰.

要理解为什么这是"最小值",需要了解Java(或IEEE-754)浮点值的工作原理.有了这种认识,阅读文档后,很明显,Float.MIN_VALUE通过一个浮动的尾数和指数成分的最小非零值表示的.或者,float可以表示的最小正值.

"真实最小值"是-Float.MAX_VALUE因为Float.MAX_VALUE表示浮点数的尾数和指数分量可以表示的最大值.由于浮点的符号存储为离散位,因此正数和负数的范围限制相同.

这与整数在Java(以及大多数CPU)中的工作方式不同:它们使用二进制编码进行编码.(有些计算机系统使用离散符号位,称为"一个补码",然后有两个整数值为零:0和-0!)

快乐的研究!