Il più veloce modo più efficace per determinare il valore decimale è intero in Java

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

  •  21-09-2019
  •  | 
  •  

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top