2012-09-27 24 views
8

Tôi đang cố gắng thực hiện một số công cụ tính toán cơ bản trong ứng dụng Android của mình để so sánh giá trị Date.getTime() với một số nội dung được tính toán.Android/Java: dài bị âm mà không vượt quá max_value

Việc tính toán tôi làm trong một truy vấn cơ sở dữ liệu là:

long minus = pauseDays * 24 * 60 * 60 * 1000; 

Vì vậy, về cơ bản tôi tính toán millisecond-giá trị của pauseDays. Nếu pauseDays trở nên lớn hơn (tôi đang nói khoảng 90 ngày hoặc lâu hơn), điều gì đó lạ sẽ xảy ra. Kết quả tính toán là số âm.

Điều kỳ lạ là kết quả phải là 7776000000, vì vậy nó phải nhỏ hơn Long.MAX_VALUE. Ai có thể giải thích cho tôi tại sao tôi nhận được một số âm ở đây?

Trả lời

21

Lý do có thể là vì pauseDays là loại int, phải không? Sau đó, bạn nhân nó với một nhóm khác là int s, rồi chuyển đổi thành long.

Cân nhắc this:

public class Main { 
    public static void main(String[] args) { 
    int pauseDays = 90; 
    long minus = pauseDays * 24 * 60 * 60 * 1000; 
    System.out.println(minus); 

    long pauseDaysL = 90L; 
    long minusL = pauseDaysL * 24L * 60L * 60L * 1000L; 
    System.out.println(minusL); 
    } 
} 

Kết quả của việc này là:

-813934592 
7776000000 

Chú ý rằng long minus đầu tiên sử dụng số nguyên để tạo ra giá trị của nó. Thứ hai long minusL sử dụng tất cả các giá trị số nguyên dài.

+0

Đánh bại tôi với nó :) +1 – Brian

+0

Cảm ơn, đã giải quyết được vấn đề của tôi :) Tôi hoàn toàn bỏ qua thực tế, rằng pauseDays ist giá trị INT. – user1515310

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