2011-07-20 13 views

Trả lời

13

Các dài x bạn đang tạo không phải là giá trị mà bạn mong đợi. Nó nằm trong phạm vi số nguyên. Để tạo chờ đợi, sử dụng:

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

Các x bạn tính toán, trong phạm vi số nguyên, là 500654080. Điều này chia cho y (= 86400000), dẫn đến 5.794607407407407.... Java cắt ngắn phần thập phân gây ra số 5. ​​

Bằng cách thêm L sau chữ số, bạn yêu cầu trình biên dịch biên dịch nó dưới dạng long thay vì int. Giá trị cho x bạn mong đợi là 86400000000. Nhưng được biên dịch như một int.

Chúng ta có thể tái tạo các giá trị sai cho x (500654080) bằng cách cắt xén nó đến một int:

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

Chỉ một trong các chữ cái đó trong mỗi biểu thức cần phải là 'dài'. Xem câu trả lời của @ Peter. –

+0

@Martijn: đã được chấp nhận. nhưng câu trả lời 5 như thế nào? –

+0

Tôi biết, nhưng tôi nghĩ đây là tùy chọn kiểu. –

5

Các biểu thức 24*60*60*1000*1000 là một loại int không phải là một long gì bạn muốn là 24L*60*60*1000*1000 đó là long

Đây là những gì bạn có.

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

những gì bạn muốn là

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

Để rõ ràng về nó, bạn luôn có thể làm một '1L * 24 * 60 * 60 * 1000 * 1000'. –

+0

Trong trường hợp đó bạn có thể thực hiện '(dài) 24 * 60 * 60 * 1000 * 1000' –

+0

Khi nào quảng cáo dài sẽ diễn ra? Đối với 24 hoặc kết quả đầy đủ (intified)? Việc đúc –

1

24*60*60*1000*1000 là quá lớn để phù hợp với một int và tràn.

1

Khéo léo!

Vấn đề là 24, 60 và 1000 là chữ cái Java ints. Trước khi các giá trị được gán cho x và y, chúng được cắt ngắn để vừa với giá trị int. Hãy thử

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

để xem chính xác ý tôi là gì. Sửa chữa nhanh là làm cho các chữ cái của bạn thành các giá trị dài như vậ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); 
} 
} 
+0

Bị đánh vào cú đấm! Không phải là khá khó khăn như tôi nghĩ, tôi đoán :) – Eric

2

đúc (bắt buộc) để hoạt động lâu dài trong trường hợp giá trị bằng chữ cho toán hạng phải; nhưng vấn đề vẫn tồn tại trong trường hợp gán một biến dài khác, như trong ví dụ đưa ra dưới đâ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"); 
    } 

} 

Cách duy nhất tôi có thể nhận được câu trả lời thích hợp là bằng cách chuyển đổi các bộ phận của chờ đợi vào chia đôi. Nó là rất kỳ lạ tại sao phân chia của longs cư xử theo cách bí ẩn như vậy.

longDivision cung cấp câu trả lời bằng 0 trong khi doubleDivision đưa ra câu trả lời đúng.

Tôi hy vọng điều này sẽ giúp những người khác gặp sự cố tương tự ...

Các vấn đề liên quan