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

