整数除法:为什么打印错误的值?

时间:2019-01-05 11:14:17

标签: java integer long-integer

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

2 个答案:

答案 0 :(得分:0)

在这些行中:

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

每个常数整数的类型均为int,计算的结果也为类型int
但是您期望得到的结果是:86400000000的{​​{1}}太大,无法放入MICRO_PER_DAY的32位中,因此会被截断。
这称为数字溢出
要获得正确的结果,请使用以下方法:

int

final long MICRO_PER_DAY=24L * 60 * 60 * 1000 * 1000; final long MILLIS_PER_DAY= 24L * 60 * 60 * 1000; 之后的L后缀将指导编译器,以便它确实将结果存储在类型24的64位中,而不截断它。

答案 1 :(得分:-2)

即使它是两个long值,它也在进行整数除法。如果您执行System.out.println(1.0 * MICRO_PER_DAY / MILLIS_PER_DAY);,则会获得一个浮点数。

寻找避免整数除法的最佳方法将是您的最佳选择,并且会根据您的应用程序进行更改。