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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:36:02