常量列表与说明

1. 数值范围常量

常量 类型 说明
MIN_VALUE float 1.4E-45f 最小正正规数(正的最小可表示非零值)
MAX_VALUE float 3.4028235E38f 最大有限值(正的最大可表示有限值)
MIN_NORMAL float 1.17549435E-38f 最小正规数(正的最小正规格化数)

🔍 MIN_VALUE vs MIN_NORMAL

  • MIN_NORMAL:最小正规格化数(指数部分非全0)
  • MIN_VALUE:最小正非正规数(subnormal/denormalized number),比 MIN_NORMAL 小得多
System.out.println("MIN_NORMAL: " + Float.MIN_NORMAL); // 1.17549435E-38
System.out.println("MIN_VALUE:  " + Float.MIN_VALUE);  // 1.4E-45

2. 指数范围常量

常量 类型 说明
MAX_EXPONENT int 127 最大指数(在无偏置形式下)
MIN_EXPONENT int -126 最小指数(在无偏置形式下)

💡 IEEE 754 规则

  • 实际存储的指数是偏置的(bias = 127)
  • 存储值范围:12540255 用于特殊值)
  • 真实指数 = 存储值 - 127
  • 因此真实指数范围:-126+127

3. 类型信息常量

常量 类型 说明
SIZE int 32 float 类型的位数(bit)
BYTES int 4 float 类型的字节数(byte)
TYPE Class<Float> float.class float 基本类型的 Class 对象
System.out.println("Size:  " + Float.SIZE  + " bits");  // 32 bits
System.out.println("Bytes: " + Float.BYTES + " bytes"); // 4 bytes
System.out.println("Type:  " + Float.TYPE);             // float

4. 特殊值常量

常量 类型 说明
NaN float NaN 非数字(Not-a-Number)
POSITIVE_INFINITY float Infinity 正无穷大
NEGATIVE_INFINITY float -Infinity 负无穷大
System.out.println(Float.NaN);                // NaN
System.out.println(1.0f / 0.0f);              // Infinity
System.out.out.println(Float.POSITIVE_INFINITY); // Infinity
System.out.println(-1.0f / 0.0f);             // -Infinity
System.out.println(Float.NEGATIVE_INFINITY);  // -Infinity

示例代码

1. 验证常量值

public class FloatConstantsDemo {
    public static void main(String[] args) {
        System.out.println("=== 数值范围 ===");
        System.out.println("MIN_NORMAL: " + Float.MIN_NORMAL);
        System.out.println("MIN_VALUE:  " + Float.MIN_VALUE);
        System.out.println("MAX_VALUE:  " + Float.MAX_VALUE);

        System.out.println("\n=== 指数范围 ===");
        System.out.println("MIN_EXPONENT: " + Float.MIN_EXPONENT); // -126
        System.out.println("MAX_EXPONENT: " + Float.MAX_EXPONENT); // 127

        System.out.println("\n=== 类型信息 ===");
        System.out.println("SIZE:  " + Float.SIZE  + " bits");
        System.out.println("BYTES: " + Float.BYTES + " bytes");
        System.out.println("TYPE:  " + Float.TYPE);

        System.out.println("\n=== 特殊值 ===");
        System.out.println("NaN:              " + Float.NaN);
        System.out.println("POSITIVE_INFINITY: " + Float.POSITIVE_INFINITY);
        System.out.println("NEGATIVE_INFINITY: " + Float.NEGATIVE_INFINITY);
    }
}

2. 验证 NaN 特性

float nan1 = Float.NaN;
float nan2 = 0.0f / 0.0f;

System.out.println(nan1 == nan2);           // false! NaN != NaN
System.out.println(Float.isNaN(nan1));      // true
System.out.println(Float.isNaN(nan2));      // true

3. 验证无穷大

System.out.println(1.0f / 0.0f == Float.POSITIVE_INFINITY); // true
System.out.println(-1.0f / 0.0f == Float.NEGATIVE_INFINITY); // true

使用技巧

✅ 技巧1:检查特殊值

float value = calculate();

if (Float.isNaN(value)) {
    System.out.println("结果无效");
} else if (value == Float.POSITIVE_INFINITY) {
    System.out.println("结果溢出(正)");
} else if (value == Float.NEGATIVE_INFINITY) {
    System.out.println("结果溢出(负)");
} else {
    System.out.println("结果: " + value);
}

✅ 技巧2:使用 isFinite()

// Java 8+
if (Float.isFinite(value)) {
    // 安全使用 value
} else {
    // 处理无穷大或 NaN
}

✅ 技巧3:类型检查

Class<?> type = someObject.getClass();
if (type == Float.TYPE) {
    System.out.println("是 float 基本类型");
}

常见错误

❌ 错误1:认为 MIN_VALUE 是最小可表示数

// 错误理解
// Float.MIN_VALUE 是最小**正**数,不是最负的数

float minPositive = Float.MIN_VALUE;     // 1.4E-45
float maxNegative = -Float.MAX_VALUE;    // -3.4E38 (最负的数)

❌ 错误2:直接比较 NaN

float value = Float.NaN;
// if (value == Float.NaN) { ... } // 永远为 false!

// 正确
if (Float.isNaN(value)) { ... }

❌ 错误3:混淆 SIZEBYTES

System.out.println(Float.SIZE);  // 32 (bits)
System.out.println(Float.BYTES); // 4  (bytes)

注意事项

  1. NaN 不等于任何值:包括它自己,必须用 Float.isNaN() 检查。
  2. 无穷大参与运算:有定义的规则(如 ∞ + ∞ = ∞∞ - ∞ = NaN)。
  3. 非正规数MIN_VALUEMIN_NORMAL 之间的数是非正规数,精度较低。
  4. 类型常量Float.TYPEfloat.class,用于反射和类型比较。

总结

常量 用途 值/类型
MIN_VALUE 最小正非正规数 1.4E-45f
MAX_VALUE 最大有限值 3.4028235E38f
MIN_NORMAL 最小正规数 1.17549435E-38f
MAX_EXPONENT 最大指数 127
MIN_EXPONENT 最小指数 -126
SIZE 位数 32
BYTES 字节数 4
TYPE 基本类型 Class float.class
NaN 非数字 NaN
POSITIVE_INFINITY 正无穷大 Infinity
NEGATIVE_INFINITY 负无穷大 -Infinity