Il più veloce modo più efficace per determinare il valore decimale è intero in Java
Domanda
Data una variabile denominata doppio sizeValue
e sizeValue
contiene qualcosa di diverso da 0, qual è il modo più efficace per determinare che sizeValue
contiene un valore che è un numero intero?
Al momento sto usando
sizeValue% 1 == 0
qualsiasi altro modo più veloce?
Soluzione
dare una prova di Math.ceil :
private static boolean isInt(double x) {
return x == Math.ceil(x);
}
Modifica
Ho fatto alcuni benchmark con i seguenti metodi:
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
è la più veloce di loro (su un sunjre 1.6)
Altri suggerimenti
Non sono sicuro se è più veloce, ma si potrebbe lanciare la vostra doppia per un int e di test per l'uguaglianza:
double d = 123.456;
boolean dIsAnInteger = (d == (int)d);
Attenzione: vuoi prendere in considerazione 0.9999999999999999
un intero? Probabilmente no. Ma guarda questo:
double val = 0;
for(int i=0;i<10;i++)
System.out.println(val+=0.1);
Questo stampa:
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
che è problematico perché alla fine del programma di val
contiene qualcosa che si pensa dovrebbe essere un numero intero, ma non lo è.
Così mi piacerebbe fare il mio metodo un po 'più lento (ma più corretto) integrando un delta come JUnit fa:
private static boolean isInt(double x, double delta) {
double ceil = Math.ceil(x);
return x-delta<ceil && x+delta>ceil;
}
e, naturalmente, fornire lo stesso metodo con un valore predefinito ragionevole:
private static boolean isInt(double x) {
return isInt(x, 0.000000001);
}
Ora isInt(val)
finalmente restituisce true.