Más rápida manera más eficiente para determinar el valor decimal es un número entero en Java

StackOverflow https://stackoverflow.com/questions/1575052

  •  21-09-2019
  •  | 
  •  

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top