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

Java中大数范围值比较结果异常?==与差值比较差异原因探究

问题原因解析

1. Long包装类的==比较本质

Java里的Long是引用类型,用==比较时,判断的是两个对象的内存地址是否相同,而非存储的数值是否相等:

  • 只有当两个Long是同一个对象实例时,==才会返回true。
  • JVM仅会缓存-128到127范围内的Long对象,超出该范围的Long,哪怕数值一致,也是独立的对象实例,内存地址不同,因此x==y返回false。

2. x-y==0的数值比较逻辑

对Long对象执行减法运算时,Java会自动触发拆箱操作,将x和y转换为long基本数据类型:

  • 此时的减法是针对基本类型数值的运算,得到的结果也是long类型。
  • 只要两个对象存储的数值相等,x-y的结果就为0,因此判断返回true。

补充:Math.pow的精度说明

虽然Math.pow返回的double类型对超大整数可能存在精度损失,但在这个案例中,Math.pow(200000000, 2)转换为long后的数值,与2*20000000000000000的数值完全一致,这是x-y==0返回true的前提。若精度误差导致数值不一致,该判断也会返回false。

内容的提问来源于stack exchange,提问作者Anand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:17:51