你认为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");
}
我没想到浮动的最小值会是正值...找不到任何用途。
答案 0 :(得分:16)
根据Float.MIN_VALUE的文档:
保持float类型的最小正非零值的常量,2-149。它等于十六进制浮点字面值0x0.000002P-126f,也等于Float.intBitsToFloat(0x1)。
虽然名称有争议,因为float
的“真实最小值”为-Float.MAX_VALUE
,但我怀疑MIN_VALUE
是为了与其他数字类型保持一致而选择的。使用名称MIN_RANGE_VALUE
和MAX_RANGE_VALUE
(或类似名称)可能会使区别更加清晰。
要理解为什么这是“最小值”,需要了解Java(或IEEE-754)浮点值的工作原理。通过这种见解,在阅读文档之后,很明显Float.MIN_VALUE
是可由浮点数的尾数和指数分量表示的最小非零值。或者,float可以表示的最小正值。
“真实最小值”为-Float.MAX_VALUE
,因为Float.MAX_VALUE
表示浮点数的尾数和指数分量可以表示的最大值。由于浮点数的符号存储为离散位,因此范围限制对于正数和负数都是相同的。
这与整数在Java(以及大多数CPU)中的工作方式不同:它们使用two's complement进行编码。 (有些计算机系统使用离散符号位,称为“一个补码”,然后有两个整数值零:0和-0!)
快乐的研究!