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.原因?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.原因?Java中的長分區不按預期方式工作
長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` */
每個表達式中只有一個文字需要是「long」。見@彼得的答案。 –
@Martijn:接受。但答案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);
爲了明確它,你總是可以做'1L * 24 * 60 * 60 * 1000 * 1000'。 –
在這種情況下,你可以做'(長)24 * 60 * 60 * 1000 * 1000' –
什麼時候int-> long promotion會發生? 24或全部(無效)結果? –
24*60*60*1000*1000
是太大,無法爲int
和溢出。
棘手的一個!
問題是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);
}
}
毆打!不像我想的那麼棘手,我想:) – Eric
鑄造在右操作數的文字值的情況下(強迫)長的作品;但問題仍然存在分配一個長變量到另一個,如下面給出的例子的情況下:
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給出了正確的答案。
我希望這可以幫助別人誰遇到過類似的問題...
http://ideone.com/z78Sg –
的http:// ideone。com/3vygF –