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

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.原因?

您创建的长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` */ 

表达式24*60*60*1000*1000是一个int类型不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); 

整蛊一个!

问题是24,60和1000是Java文字整数 。 在将值分配给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); } } 

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

 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给出了正确的答案。

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

24*60*60*1000*1000太大而无法插入int并溢出。