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

为何修改数据类型会导致1到100奇数乘积的计算结果完全不同?

不同数据类型输出异常的核心原因

1到100区间所有奇数的乘积(即99的双阶乘99!)实际值约为2.7253921397507295029807507003872e78,远超过Java基础数据类型的存储/精度上限,不同类型的异常表现对应不同的底层规则:

  • int类型输出负数
    Java中int是32位有符号整数,最大值仅为2^31-1 = 2147483647,乘积运算很快就超出了该上限,触发有符号整数的补码溢出规则,高位符号位被置为1,最终输出负数结果。
  • long类型输出错误数值
    long是64位有符号整数,最大值为2^63-1 ≈ 9.2e18,仍然远小于目标乘积的2.7e78,同样会发生溢出,Java对整数溢出的处理是直接截断高位保留低64位,因此输出的5196472710489536419是截断后的错误结果,不是真实乘积。
  • float类型输出Infinity
    float是32位单精度浮点数,可表示的最大正数值约为3.4e38,目标乘积远超出该范围,因此直接被判定为正无穷,输出Infinity。
  • double类型输出近似值
    double是64位双精度浮点数,可表示的最大正数值约为1.7e308,目标乘积在它的数值表示范围内,但浮点数仅能保留约15~17位十进制有效数字,目标乘积有接近80位十进制数,因此只能存储近似值,输出的科学计数法结果是精度丢失后的近似表达。

正确计算方案

如果需要得到精确的乘积结果,使用Java提供的java.math.BigInteger类即可,示例代码如下:

import java.math.BigInteger;

public class OddProduct {
    public static void main(String[] args) {
        BigInteger total = BigInteger.ONE;
        for (int i = 1; i <= 100; i++) {
            if (i % 2 != 0) {
                total = total.multiply(BigInteger.valueOf(i));
            }
        }
        System.out.println(total);
    }
}

内容的提问来源于stack exchange,提问作者Qusay Abu Auda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:06:01