论坛首页 入门技术论坛

Java连续乘法遇到的问题

浏览 3208 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-07-12   最后修改:2009-07-12
采用 JDK 1.6_13版本,发现一个奇怪的问题。

    long period =30* 24 * 60 * 60 * 1000;
   System.out.println("30 * 24 * 60 * 60 * 1000="+period);


执行,输出结果非常可怕。

JDK 1.6 输出结果:

30 * 24 * 60 * 60 * 1000=-1702967296
 


JDK 1.5 输出结果:
30 * 24 * 60 * 60 * 1000=-1702967296
 



难道是Java的BUG吗?我很难相信,Java在处理这么简单的事情,居然会有BUG。

我将以上测试代码,稍微调整之后,如下
long period = 24 * 60 * 60 * 1000;
System.out.println("24 * 60 * 60 * 1000=" + period);
period *= 30;
System.out.println("30 * 24 * 60 * 60 * 1000=" + period);


JDK1.6输出如下结果:
24 * 60 * 60 * 1000=86400000
30 * 24 * 60 * 60 * 1000=2592000000


JDK1.5输出如下结果:
24 * 60 * 60 * 1000=86400000
30 * 24 * 60 * 60 * 1000=2592000000


调整后,Java的处理结果完全正确。


再次调整代码,如下:
long period = 30l * 24 * 60 * 60 * 1000;
System.out.println("30l * 24 * 60 * 60 * 1000=" + period);


输出:
30l * 24 * 60 * 60 * 1000=2592000000


输出结果正确。

总结如下:

    Java在处理连续乘法或除法时,最好注明数字的类型,否则可能会得到不正确的结果。

  



   发表时间:2009-07-12  
默认是Integer,超过了最大值2^31,溢出了
0 请登录后投票
   发表时间:2009-07-12  
溢出了,兄台.....
0 请登录后投票
   发表时间:2009-07-13  
呵呵!让各位见笑了!

以前没注意过这方面。

是我错怪Java了。
0 请登录后投票
   发表时间:2009-08-13   最后修改:2009-11-04
溢出嘛,用大整数类型的classes...要不换Scala,书写起来还漂亮点。
0 请登录后投票
   发表时间:2010-04-02  
纠正下1楼,int最大值是2^31-1
0 请登录后投票
   发表时间:2010-04-03  
BigDicmal
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics