不同。
此代码
System.out.println(Double.MAX_VALUE+12345 == Double.MAX_VALUE);
System.out.println(Integer.MAX_VALUE+12345 == Integer.MAX_VALUE);
返回true
false
规则是一样的,只是Double.MAX_VALUE
太大了,12345
大约要小300个数量级(10300倍)。添加一个比Double.MAX_VALUE
小得多的数字不会改变它的值。不过,添加一个相同数量级的数字会产生不同的效果:
Double.MAX_VALUE + 1E300
产生正无穷结果,这与Double.MAX_VALUE
(demo)
int型和double型对最大值进行加法的行为有两个重要的区别:
- 除最大值外,每个int与其直接后继值的差值为1,无论大小如何。连续双打之间的差异随着量级的增加而增加。例如,
Double.MAX_VALUE
与下一个比它小的double之间的差的绝对值约为2e292。1.0和下一倍小于它的差的绝对值约为1.1e-16。 - 每个32位模式表示一个int数。一些64位模式以双精度保留给NaN和无限值。添加一个到
Integer.MAX_VALUE
环绕Integer.MIN_VALUE
。加一个足够大的正数来改变Double.MAX_VALUE
,结果是Double.POSITIVE_INFINITY
,由一个保留位模式表示。
int
基于2的补二进制算法。它被设计成紧凑,高效,并允许非常快速的简单运算。
double
更倾向于功能。通常,浮点运算需要一个以上的机器周期。它可以承受保留位模式,例如需要特殊处理的无穷大。