2009-10-15 8 views

Répondre

6

donner un essai à Math.ceil:

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

EDIT

Je l'ai fait quelques points de repère avec les méthodes suivantes:

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 est le plus rapide d'entre eux (sur a sunjre 1.6)

+0

jms, vous pouvez changer votre vote maintenant. – akf

+0

Est-ce que Math.ceil est plus rapide? - Si oui, pourquoi? Quelle magie fait-il? :-) – Adamski

+0

+1 J'utiliserais Math.floor, mais cela n'a pas vraiment d'importance. – starblue

3

Je ne sais pas si elle est plus vite, mais vous pouvez jeter votre double pour un entier et un test pour l'égalité:

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

-1 Ne fonctionne pas au-delà de 2^31. L'utilisation de long serait seulement un peu moins faux. – starblue

1

Avertissement: envisageriez-vous 0.9999999999999999 un entier? Probablement pas. Mais attention ceci:

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

Ceci affiche:

0.1 
0.2 
0.30000000000000004 
0.4 
0.5 
0.6 
0.7 
0.7999999999999999 
0.8999999999999999 
0.9999999999999999 

Ce qui est problématique, car à la fin du programme val contient quelque chose que vous pensez devrait être entier, mais n'est pas.

Alors je ferais ma méthode un peu plus lent (mais plus correct) en intégrant un delta comme JUnit fait:

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

et bien sûr fournir la même méthode avec un défaut raisonnable:

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

Maintenant, isInt(val) retourne finalement vrai.

Questions connexes