此代码
System.out.println(Double.MAX_VALUE+12345 == Double.MAX_VALUE);
System.out.println(Integer.MAX_VALUE+12345 == Integer.MAX_VALUE);
返回
true
false
请澄清这种差异。
答案 0 :(得分:2)
规则是相同的,Double.MAX_VALUE
是如此之大,12345
大约300个数量级(10 300 次)。添加比Double.MAX_VALUE
小得多的数字不会改变其值。但是,添加一个具有相同数量级的数字会产生影响:
Double.MAX_VALUE + 1E300
产生正无穷大结果,与Double.MAX_VALUE
(demo)
答案 1 :(得分:1)
添加到最大值的行为在int和double之间以两种非常重要的方式不同:
Double.MAX_VALUE
与下一个小于它的差值的绝对值约为2e292。 1.0和下一个小于1.0e-16的差值的绝对值约为1.1e-16。Integer.MAX_VALUE
包裹到Integer.MIN_VALUE
。添加足够大的正数以对Double.MAX_VALUE
产生影响会产生Double.POSITIVE_INFINITY
,由其中一个保留位模式表示。 int
基于2的补码二进制算法。它设计紧凑,高效,并允许非常快速的简单算术。
double
更偏向于功能性。通常,浮点运算需要多个机器周期。它可以保留需要特殊处理的保留位模式,例如无穷大。