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来重现x
( 500654080
)的错误值:
// 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
并溢出。