java - 整数除法:为什么打印错误的值?
问题描述
public class PragsLongDivision{
public static void main (String [] args){
final long MICRO_PER_DAY=24 * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY= 24 * 60 * 60 * 1000;
System.out.println(MICRO_PER_DAY / MILLIS_PER_DAY );
}
}
这个程序打印 5 为什么?请用理性分享最好的问候。
解决方案
在这些行中:
final long MICRO_PER_DAY=24 * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY= 24 * 60 * 60 * 1000;
每个常量整数都是 type int
,计算的结果也是 type int
。
但是您会期望得到的结果:86400000000
forMICRO_PER_DAY
太大而无法放入 an 的 32 位,int
因此它会被截断。
这称为数值溢出。
要获得正确的结果,请使用:
final long MICRO_PER_DAY=24L * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY= 24L * 60 * 60 * 1000;
后面的L
后缀24
将指导编译器,以便它确实将结果存储在 64 位类型中long
而不是截断它。
推荐阅读
- java - Mybatis 同时使用 WHERE IF DESC 和 LIMIT 时,IDEA 显示 Unable to resolve table 'LIMIT'
- java - 单个字符串中的多个字符串替换生成所有可能的组合
- mysql - 在 sql 单元格中传递多个前值
- asynchronous - 未来
, async, await, then, Flutter/Dart 中的 catchError - jquery - 猫头鹰轮播项目不会滚动
- javascript - Netsuite SuiteScript 礼品卡问题
- azure - Azure Function App:在门户中为新功能应用加载 V3 时出错?
- apache - 为重写路径禁用 htaccess 身份验证
- python - re 模块中的 Findall() 没有给我与搜索相同的结果
- sql - 根据不同的列选择 Top 1