2009-10-15 11 views

Odpowiedz

6

dać spróbować Math.ceil:

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

EDIT

zrobiłem kilka wzorców z następujących metod:

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 jest szybciej z nich (na a sunjre 1.6)

+0

jms, możesz teraz zmienić swój głos. – akf

+0

Czy Math.ceil jest szybszy? - Jeśli tak, dlaczego? Jaka magia to robi? :-) – Adamski

+0

+1 Używałbym Math.floor, ale to nie ma znaczenia. – starblue

3

Nie jestem pewien, czy to jest szybciej, ale można oddać swój double do int i test równości:

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

-1 Nie działa po 2^31. Używanie długich byłoby tylko trochę mniej błędne. – starblue

1

Warning: byłoby rozważyć 0.9999999999999999 liczbę całkowitą? Prawdopodobnie nie. Ale to patrzeć:

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

ten wypisuje:

0.1 
0.2 
0.30000000000000004 
0.4 
0.5 
0.6 
0.7 
0.7999999999999999 
0.8999999999999999 
0.9999999999999999 

Który jest problematyczne, ponieważ pod koniec programu w val zawiera coś, co naszym zdaniem powinno być liczbą całkowitą, ale nie jest.

Więc ja robię moją metodę nieco wolniej (ale bardziej poprawne) poprzez integrację deltę jak JUnit robi:

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

i oczywiście zapewnić ten sam sposób z rozsądną domyślnie:

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

Teraz isInt(val) wreszcie zwraca wartość true.

Powiązane problemy