2009-10-15 8 views

Respuesta

6

darle una oportunidad a Math.ceil:

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

EDITAR

que he hecho algunos puntos de referencia con los siguientes métodos:

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 es el más rápido de ellos (en un sunjre 1.6)

+0

jms, puede cambiar su voto ahora. – akf

+0

¿Math.ceil es más rápido? - Si es así, ¿por qué? ¿Qué magia está haciendo? :-) – Adamski

+0

+1 Yo usaría Math.floor, pero eso realmente no importa. – starblue

3

No estoy seguro de si es más rápido, pero se puede emitir su doble a un int y la prueba de la igualdad:

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

-1 No funciona más allá de 2^31. Usar mucho tiempo solo sería un poco menos incorrecto. – starblue

1

Advertencia: ¿consideraría 0.9999999999999999 un entero? Probablemente no. Pero cuidado con esto:

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

Esto muestra:

0.1 
0.2 
0.30000000000000004 
0.4 
0.5 
0.6 
0.7 
0.7999999999999999 
0.8999999999999999 
0.9999999999999999 

que es problemático, porque al final del programa val contiene algo que cree que debería ser un número entero, pero no lo es.

Así que me gustaría hacer mi método un poco más lento (pero más correcto) mediante la integración de un delta como JUnit hace:

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

y por supuesto proporcionan el mismo método con un valor predeterminado sensata:

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

Ahora isInt(val) finalmente devuelve verdadero.

Cuestiones relacionadas