2009-10-15 42 views

Trả lời

6

cung cấp cho một cố gắng để Math.ceil:

private static boolean isInt(double x) { 
    return x == Math.ceil(x); 
} 

EDIT

tôi đã thực hiện một số tiêu chuẩn với các phương pháp sau:

private static boolean isInt1(double x) { 
    return x == (int) x; 
} 

private static boolean isInt2(double x) { 
    return x == Math.ceil(x); 
} 

private static boolean isInt3(double x) { 
    return x % 1 == 0; 
} 

isInt1 là nhanh hơn trong số họ (trên a sunjre 1.6)

+0

jms, bạn có thể thay đổi phiếu bầu của mình ngay bây giờ. – akf

+0

Math.ceil có nhanh hơn không? - Nếu vậy, tại sao? Ma thuật đang làm gì vậy? :-) – Adamski

+0

+1 Tôi muốn sử dụng Math.floor, nhưng điều đó không thực sự quan trọng. – starblue

3

Tôi không chắc chắn nếu nó là bất kỳ nhanh hơn, nhưng bạn có thể đúc đôi bạn đến một int và thử nghiệm cho sự bình đẳng:

double d = 123.456; 
boolean dIsAnInteger = (d == (int)d); 
+0

-1 Không hoạt động vượt quá 2^31. Sử dụng lâu sẽ chỉ hơi sai một chút. – starblue

1

Cảnh báo: bạn sẽ xem xét 0.9999999999999999 một số nguyên? Chắc là không. Nhưng xem này:

double val = 0; 
for(int i=0;i<10;i++) 
    System.out.println(val+=0.1); 

này in ra:

0.1 
0.2 
0.30000000000000004 
0.4 
0.5 
0.6 
0.7 
0.7999999999999999 
0.8999999999999999 
0.9999999999999999 

Đó là vấn đề bởi vì ở phần cuối của chương trình val chứa một cái gì đó mà bạn nghĩ rằng nên số nguyên nhưng không phải vậy.

Vì vậy, tôi muốn làm cho phương pháp của tôi chậm hơn một chút (nhưng đúng hơn) bằng cách tích hợp một vùng châu thổ như JUnit làm:

private static boolean isInt(double x, double delta) { 
    double ceil = Math.ceil(x); 
    return x-delta<ceil && x+delta>ceil; 
} 

và tất nhiên cung cấp các phương pháp tương tự với một mặc định hợp lý:

private static boolean isInt(double x) { 
    return isInt(x, 0.000000001); 
} 

Bây giờ isInt(val) cuối cùng cũng trả về giá trị đúng.

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