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.原因?
答案 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来重现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` */
答案 1 :(得分:5)
表达式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);
答案 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
并溢出。