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

Java中long类型除法出现意外结果:为何输出为5?

为什么这段Java代码输出结果是5?

嘿,这个问题我太熟了!本质上就是整数溢出在搞鬼,咱们一步步拆解来看:

  • Java里的整数字面量默认是int类型:你看代码里的24、60、1000这些数字,没有加L后缀,所以它们都是int。计算a和b的时候,一开始的乘法运算都是在int的范围内进行的,直到最后才把结果转成long——但这时候已经晚了!

  • 计算a时发生了溢出:咱们算一下24 * 60 * 60 * 1000 * 1000的实际值是86400000000,但int的最大值只有2^31-1(也就是2147483647),这个结果远远超出了int的范围。根据Java的规则,有符号整数溢出后会循环绕回,最终得到的错误值是500654080,然后这个值被赋值给了long类型的a。

  • 计算b时没有溢出:24 * 60 * 60 * 1000的结果是86400000,这个数小于int的最大值,所以运算正常,b得到了正确的86400000L。

  • 最后除法的结果:用错误的a值(500654080)除以正确的b值(86400000),整数除法会舍去小数部分,500654080 / 86400000 = 5,这就是你看到的输出结果。

如果想要得到正确的结果(1000),只需要把其中一个数字改成long类型就行,比如把第一个数写成24L,这样整个乘法运算就会以long的精度进行,不会发生溢出:

final long a = 24L * 60 * 60 * 1000 * 1000;
final long b = 24 * 60 * 60 * 1000;
System.out.println(a/b); // 输出1000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:01:29