Java中Double类型大数相乘结果为-1或0的问题咨询
问题根因
1. 示例代码输出0的原因
你给出的代码中,字面量2默认是Java的int(32位有符号整数)类型,多个int值相乘的运算结果仍为int类型,int的合法取值范围仅为-2^31 ~ 2^31-1。
连续乘2的过程中,运算结果超出int取值范围时会触发整数溢出,溢出部分按补码规则直接截断,乘到第32次时有效位已经全部溢出,最终乘满64次的结果就是0。
2. 计算2^64返回-1的原因
该场景一般是使用了long(64位有符号整数)类型做运算:long的合法取值范围为-2^63 ~ 2^63-1,2^64超出取值范围触发整数溢出后,补码表示的结果恰好为-1。
你提到的预期值18446744073709552000是2^64用double类型表示的近似值,2^64的精确整数值为18446744073709551616。
解决方案
- 要获取精确超大整数结果,使用
BigInteger类实现运算:
// 计算2^64的正确示例 BigInteger result = BigInteger.ONE.shiftLeft(64); System.out.println(result); // 输出:18446744073709551616
- 要获取double近似结果,把第一个运算数改为
double类型字面量2.0,触发整个运算自动提升为double类型:
System.out.println(2.0*2*2*/* 此处省略剩余62个2 */*2);
注意:double仅能精确表示不超过2^53的整数,更大的整数会存在精度损失。
内容的提问来源于stack exchange,提问作者nnhjbxozqxs
相关产品推荐
相关产品推荐

