首页 > 解决方案 > 整数除法:为什么打印错误的值?

问题描述

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 为什么?请用理性分享最好的问候。

标签: javaintegerlong-integer

解决方案


在这些行中:

 final long MICRO_PER_DAY=24 * 60 * 60 * 1000 * 1000;
 final long MILLIS_PER_DAY= 24 * 60 * 60 * 1000;

每个常量整数都是 type int,计算的结果也是 type int
但是您会期望得到的结果:86400000000forMICRO_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而不是截断它。


推荐阅读