一、谜题
下面的代码中被除数表示一天的微秒数,除数表示一天的毫秒数。猜猜他的结果?
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
按照预想应该打印出1000,但是结果却是5
二、解惑
问题在于MICROS_PER_DAY的计算溢出了。
尽管long类型可以存放24 * 60 * 60 * 1000 * 1000;的值,但是因为所有乘在一起的因子都是int型,所以结果是int类型,运算完成后才转化为long类型。
在运算完成时,结果溢出,得到了比实际结果小了200倍的值,所以结果是5
三、修正方案
将第一个乘积因子转为long,可以使得后续运算使用long类型来完成。
final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY = 24L * 60 * 60 * 1000;
System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
当操作大数值时,一定要提防溢出。