同为 32 bit, 为什么 Float 比 Integer 表示的范围大?
Float 和 Integer 在 Java 中的都是 32 位, 为什么 Float 表示的范围要比 Integer 大这么多呢?
Float.MAX_VALUE = 340282346638528860000000000000000000000.000000
Integer.MAX_VALUE = 2147483647
换个角度想, 32 bit 可以表示的状态是有限的, 32 bit 最多就能表示 2^32 种状态, 而 Integer 用它们来表示了一段连续的整数. 那么 Float 呢? 显然, Float 也表示了 2^32 种状态, 只是那是与 Integer 不同的 2^32 种状态.
Float 的内部的 32 bit 存储格式, 为 S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM, 其中 S 为符号位, E 为指数, M 为底数. 所以, 一个 float = M × 2^E. E 的范围是 -128~127
因此, Float 的最大值很大, 但它并不能表示这个范围内的所有值, 例如
public static void main(String[] args) {
float f = 1999999991808f;
System.out.printf("%f\n", f);
System.out.printf("%f\n", f + 1);
System.out.printf("%f\n", f + 2);
System.out.printf("%f\n", f + 3);
}
输出
1999999991808.000000
1999999991808.000000
1999999991808.000000
1999999991808.000000