Java中的长分区没有按预期工作

时间:2011-07-20 17:43:45

标签: java long-integer

class LongDiv{
public static void main(String [] args){

    final long x = 24*60*60*1000*1000;
    final long y = 24*60*60*1000;
    System.out.println(x/y);
}
}

虽然预期的答案是1000,但是javac将其作为5.原因?

5 个答案:

答案 0 :(得分:13)

您创建的长x不是您期望的值。它在整数范围内。要创建长片,请使用:

final long x = 24L*60L*60L*1000L*1000L;
final long y = 24L*60L*60L*1000L;
System.out.println(x/y);

您计算的x在整数范围内为500654080。除以y(= 86400000),结果为5.794607407407407...。 Java会截断导致5的小数部分。

通过在数字文字后添加L,您可以告诉编译器将其编译为long而不是int。您预期的x值为86400000000。但是被编译为int。

我们可以通过将其截断为int来重现x500654080)的错误值:

// First correct
long x = 24L*60L*60L*1000L*1000L;
/* x = `86400000000`; */
// Now truncate
x &= 0xFFFFFFFFL; // again: don't forget the L suffix
/* x = `500654080` */

答案 1 :(得分:5)

表达式24*60*60*1000*1000int类型而不是long您想要的是24L*60*60*1000*1000 long

这就是你所拥有的。

final long x = (24*60*60*1000*1000) & 0xFFFFFFFF;
final long y = (24*60*60*1000) & 0xFFFFFFFF;
System.out.println(x/y);

你想要的是

final long x = 24L*60*60*1000*1000;
final long y = 24L*60*60*1000;
System.out.println(x/y);

答案 2 :(得分:2)

棘手的一个!

问题是24,60和1000是Java文字 ints 。在将值分配给x和y之前,会截断它们以适合int值。尝试

System.out.print(x + ", " + y);

准确看到我的意思。快速解决方法是将您的文字变成长值,如下所示:

public class LongDiv{
public static void main(String [] args){

    final long x = 24l*60l*60l*1000l*1000l;
    final long y = 24l*60l*60l*1000l;
    System.out.println(x/y);
}
}

答案 3 :(得分:2)

在右操作数的文字值的情况下,强制转换(强制)长期工作;但是如果将一个长变量分配给另一个变量,问题仍然存在,如下面给出的例子所示:

package utils;

public class Utils {

    public static void main(String ... clps){
        Utils.longDivision();
        Utils.doubleDivision();
    }

    private static void doubleDivision(){
        double x=new Long("54321").doubleValue();
        double y=new Long("12345").doubleValue();
        double difference=x - y;
        double percentage=(difference/x)*100.00;
        System.out.println("\nDouble Division ==> X : "+x+" ; Y : "+y+" ; Difference : "+difference+" ; percentage : "+percentage+"\n");
    }

    private static void longDivision(){
        long x=new Long("54321").longValue();
        long y=new Long("12345").longValue();
        long difference=x - y;
        long percentage=(difference/x)*100L;
        System.out.println("\nLong Division ==> X : "+x+" ; Y : "+y+" ; Difference : "+difference+" ; percentage : "+percentage+"\n");
    }

}

我能得到正确答案的唯一方法是将多头分裂转换为双打分区。很奇怪为什么长矛的分裂表现得如此神秘。

longDivision给出的答案为零,而doubleDivision给出了正确的答案。

我希望这可以帮助遇到类似问题的其他人......

答案 4 :(得分:1)

24*60*60*1000*1000太大而无法容纳int并溢出。