您的位置:首页 > 编程语言 > Java开发

java谜题3:长整除

2014-04-15 16:00 330 查看

一、谜题

下面的代码中被除数表示一天的微秒数,除数表示一天的毫秒数。猜猜他的结果?

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);
当操作大数值时,一定要提防溢出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: