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

Java整数算术溢出问题:代码未通过指定测试用例求助

问题分析与解决

问题根源

你遇到的整数乘积错误,是因为用double存储超大整数乘积后再强制转int导致的。double的有效精度只有53位,无法精确表示超过2^53的整数,当你的输入乘积(100000200000300000*500000=3e15)远超这个范围时,double无法精确存储该值,转int时就会得到Integer.MAX_VALUE(2147483647),而不是Java int溢出后正确的补码结果。

同时,你计算整数平均值的方式也绕了弯路,直接用整数除法就能完成舍弃小数的需求。

修正后的代码

import java.util.Scanner;

public class ProgrammingAssignment1 {
    public static void main(String[] args) {
        Scanner scnr = new Scanner(System.in);

        int int1 = scnr.nextInt();
        int int2 = scnr.nextInt();
        int int3 = scnr.nextInt();
        int int4 = scnr.nextInt();

        // Part 1: 整数算术计算,保留溢出后的补码结果
        int intProduct = int1 * int2 * int3 * int4;
        int intAverage = (int1 + int2 + int3 + int4) / 4;

        // Part 2: 浮点算术计算,保留三位小数
        double doubleProduct = (double) int1 * int2 * int3 * int4;
        double doubleAverage = (int1 + int2 + int3 + int4) / 4.0;

        // 输出结果
        System.out.printf("%d %d\n", intProduct, intAverage);
        System.out.printf("%.3f %.3f\n", doubleProduct, doubleAverage);
    }
}

关键修改点

  • 整数乘积:直接使用int类型连续相乘,Java会自动按照32位补码规则处理溢出,得到预期的-1679818752。
  • 整数平均值:用(int1+int2+int3+int4)/4直接做整数除法,自动舍弃小数部分,无需通过double中转。
  • 浮点部分:保持原有的double计算逻辑,确保精度符合要求。

测试验证

输入100000 200000 300000 500000时:

  • 整数部分输出:-1679818752 275000
  • 浮点部分输出:3000000000000000.000 275000.000
    完全符合预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:45:34