如下代码:public class Example003 {
public static void main(String[] args) {
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
final long MICROS_PER_DAY_L1 = 24 * 60 * 60 * 1000 * 1000L;
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
System.out.println("NO L Print:" + MICROS_PER_DAY / MILLIS_PER_DAY); //输出1
System.out.println("Has L Print:" +MICROS_PER_DAY_L1 / MILLIS_PER_DAY); //输出2
}
}
输出结果:NO L Print:5
Has L Print:1000
原因分析:
输出1和2的结果不一致的原因是计算溢出。由于MICROS_PER_DAY中所有乘起来的因子都是int,当两个int相乘时得到的结果也是int,所以MICROS_PER_DAY的计算结果是int,计算完成后(溢出)再赋值给long类型的MICROS_PER_DAY,MICROS_PER_DAY获取的是一个溢出后部分值;MICROS_PER_DAY_L1被当做一个long类型计算,计算的结果也是long,不产生溢出。所以,在操作大数字时,一定是注意溢出问题。一般在计算时,就使用long来执行。也就是在计算的因子中显式地标准数字类型。
本文出自 “winger” 博客,谢绝转载!
原文:http://imu2008.blog.51cto.com/3844842/1590791