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

时间:2012-07-10 18:42:28

标签: 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");
}

我没想到浮动的最小值会是正值...找不到任何用途。

1 个答案:

答案 0 :(得分:16)

根据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)中的工作方式不同:它们使用two's complement进行编码。 (有些计算机系统使用离散符号位,称为“一个补码”,然后有两个整数值零:0和-0!)

快乐的研究!