为何Java中Integer与Double的运算行为存在差异?
Java数值运算疑问解答
代码示例
public class Solution1 { public static void main(String[] args) { System.out.println(Double.MAX_VALUE*2 == Double.POSITIVE_INFINITY); System.out.println(Integer.MAX_VALUE+1 == Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE-1 == Integer.MAX_VALUE); System.out.println(Double.MAX_VALUE+1 == Double.MAX_VALUE); } }
运行输出
true false true true
疑问解答
1. 为什么Double.MAX_VALUE+1 == Double.MAX_VALUE为true,而Integer.MAX_VALUE+1 == Integer.MAX_VALUE为false?
整数(Integer)的运算逻辑:
Integer是32位有符号整数,用补码存储,Integer.MAX_VALUE的值是2^31-1(即2147483647)。给它加1会触发整数溢出,按照补码规则,2^31-1 +1的结果会变成Integer.MIN_VALUE(-2147483648),显然和原最大值不相等,所以等式为false。双精度浮点数(Double)的运算逻辑:
Double遵循IEEE 754双精度标准,64位存储空间分为符号位、11位指数位和52位尾数位。Double.MAX_VALUE是最大的有限双精度值,它的指数位已经用到最大合法值,尾数位全为1。当给它加1时,1相对于Double.MAX_VALUE的量级来说太小了,尾数位的精度不足以区分Double.MAX_VALUE和Double.MAX_VALUE+1,二者在双精度的精度范围内被视为同一个值,所以相加后结果还是自身,等式为true。
2. 为什么Double.MAX_VALUE*2 == Double.POSITIVE_INFINITY为true?
同样基于IEEE 754标准:Double.MAX_VALUE的指数位已经是最大的有限值,乘以2相当于需要把指数位加1,但指数位已经达到上限,无法再增大,这种情况会触发浮点数溢出,结果被定义为正无穷大(Double.POSITIVE_INFINITY),因此等式成立。
内容的提问来源于stack exchange,提问作者Bravo
相关产品推荐
相关产品推荐

