You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:18:14