最大值
在Integer 类中由static final int MAX_VALUE 指示的最大整数是2^31-1 (2,147,483,647)。该值是最大整数,因为它是最大的 32 位有符号整数。
如static final int MAX_VALUE 在Double 类中所指示的,最大双精度为(2-2^(-52))(2^1023)。 double 数据类型遵循双精度 64 位 IEEE 754 floating point 格式来表达范围广泛的动态数值。
缩小原始转换
在您的观察中,您有一个值为 2,147,483,648 的双精度数,您尝试通过类型转换将其转换为整数。
double d = 2147483648;
int i = (int) d;
原始类型之间的转换允许您将一种原始类型的值转换为另一种。从双精度数转换为整数称为Narrowing Primitive Conversion,其中您:
“可能会丢失有关数值整体大小的信息,也可能会丢失精度和范围。”
浮点数到int的窄化转换如下:
- 如果浮点数为 NaN,则结果为 int 0。
- 否则,如果浮点数不是无穷大,则浮点数将四舍五入为整数值 V,使用 IEEE 754 向零舍入模式向零舍入。如果此整数值可以表示为 int,则结果为 V。
- 否则,以下两种情况之一必须为真:该值必须太小,结果是 int 或 b 类型的最小可表示值。该值必须太大,结果是 int 类型的最大可表示值。
对于大于 Integer.MAX_VALUE 的 double 值的整数值,为了允许以整数表示,使用 Integer.MAX_VALUE 的值。
避免损失
为避免精度损失,您需要转换为原始类型或数值对象,其中最大值大于 2147483648(分辨率允许保持精度)。
long 原始类型的最大值为 2^63-1 (9.223372e+18),如果您想在数字整数空间中使用数字,这将是一个不错的选择。请注意,虽然 Long.MAX_VALUE 非常大,但由于浮点格式,Double.MAX_VALUE 要大得多。
double d = 2147483648;
long i = (long) d;