欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java长整除问题浅谈

程序员文章站 2024-02-16 10:09:52
复制代码 代码如下:public class change{  public static void main(string args[]){ final lon...

复制代码 代码如下:

public class change{
 public static void main(string args[]){
final long l1=24* 60 * 60 * 1000 * 1000;
final long l2=24* 60 * 60 * 1000;
system.out.println(l1/l2);
 }
}
/**
*   output: 5
*/ 

为什么输出的是5呢?

再看下面的代码输出:

复制代码 代码如下:

public class change{
 public static void main(string args[]){
final long l1=24l* 60 * 60 * 1000 * 1000;
final long l2=24l* 60 * 60 * 1000;
system.out.println(l1/l2);
 }
}
/**
*   output: 1000
*/

这个的输出才是我们想要的结果。到底发生了什么?

      这是因为常数l1的计算“确实”溢出了。尽管计算的结果适合放入long中,并且其空间还有富余,但这个结果并不适合放入int中。这个计算完全是以int运算来执行的,并且只有在运算完成之后,其结果才被提升到long,而此时已经太迟了:计算已经溢出了,它返回的是一个小了200倍的数值。从int到long是一种拓宽原始类型转换,它保留了(不正确的)数值。这个值之后被l2整除,而l2的计算是正确的,因为它适合int运算。这样整除的结果就得到了5。

      那为什么是int运算来执行的呢?因为所有乘在一起的因子都是int数值。当你将两个int数值相乘时,你将得到另一个int数值。java不具有目标确定类型的特性,只是一种语言特性,其含义是指存储结果的变量的类型会影响到计算所使用的类型。

     通过使用long常量来替代int常量作为每一个乘积的第一个因子,就可以很容易的订正这个程序。

     这个教训很简单:当你在操作很大的数字时,千万要提防溢出,即使用来保存结果的变量已显得足够大,也并不意味着产生结果的计算具有正确的类型。当你拿不准时,就使用long运算来执行整个计算。