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
相关产品推荐
相关产品推荐

