Más rápida manera más eficiente para determinar el valor decimal es un número entero en Java
Pregunta
Dada una variable llamada doble sizeValue
y sizeValue
contiene algo distinto de 0, ¿cuál es la forma más eficiente para determinar que sizeValue
contiene un valor que es un entero?
Actualmente estoy usando
sizeValue% 1 == 0
cualquier otra manera más rápida?
Solución
darle una oportunidad a Math.ceil :
private static boolean isInt(double x) {
return x == Math.ceil(x);
}
Editar
He hecho algunos puntos de referencia con los métodos siguientes:
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)
Otros consejos
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);
Advertencia: habría que considerar 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
Lo que es problemático, porque al final de la val
programa 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 proporcionar el mismo método con un valor predeterminado sensata:
private static boolean isInt(double x) {
return isInt(x, 0.000000001);
}
Ahora isInt(val)
finalmente vuelve verdadera.