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为什么?请与理性分享最好的问候。
答案 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);
,则会获得一个浮点数。
寻找避免整数除法的最佳方法将是您的最佳选择,并且会根据您的应用程序进行更改。