211 votes

Comment tester si un double est un entier ?

Est-il possible de le faire ?

double variable;
variable = 5;
/* the below should return true, since 5 is an int. 
if variable were to equal 5.7, then it would return false. */
if(variable == int) {
    //do stuff
}

Je sais que le code ne va probablement pas dans ce sens, mais comment fait ça va ?

1 votes

C# mais similaire en Java : stackoverflow.com/a/4077262/284240 ( Entier.MAX_VALEUR )

1 votes

Qu'est-ce que ça vous apporterait ? double y int sont représentés différemment en mémoire, et vous utiliserez l'un ou l'autre en fonction du contexte de votre manipulation de la mémoire.

0 votes

@Legend, j'aurais fait la même chose que ce que vous avez suggéré ; savez-vous par hasard comment le %1 se compare en termes d'efficacité au Math.floor(variable) suggéré par d'autres utilisateurs ?

289voto

SkonJeet Points 732

Ou vous pouvez utiliser l'opérateur modulo :

(d % 1) == 0

3 votes

J'aime vraiment la simplicité de cette solution. Elle est à la fois facile à lire et à mettre en œuvre.

1 votes

Solution très intuitive

5 votes

En termes de calcul, est-ce plus rapide que Math.rint(d) ?

166voto

maxhud Points 3034
if ((variable == Math.floor(variable)) && !Double.isInfinite(variable)) {
    // integer type
}

Ceci vérifie si la valeur arrondie du double est la même que le double.

Votre variable pourrait avoir une valeur int ou double et Math.floor(variable) a toujours une valeur int, donc si votre variable est égale à Math.floor(variable) alors il doit avoir une valeur int.

Cela ne fonctionne pas non plus si la valeur de la variable est infinie ou infinie négative, d'où l'ajout de "tant que la variable n'est pas infinie" à la condition.

3 votes

"Si l'argument est NaN ou une infinité ou un zéro positif ou un zéro négatif, alors le résultat est le même que l'argument." docs.oracle.com/javase/6/docs/api/java/lang/

2 votes

@TimSchmelter : bien vu. Il est également intéressant de noter que NaN n'est égal à rien (y compris lui-même) mais que +/-Inf est égal à lui-même - il y a donc deux cas limites !

0 votes

Skon et Fouad ont tous deux posté de bien meilleures réponses.

101voto

Louis Wasserman Points 67557

Goyave : DoubleMath.isMathematicalInteger . (Divulgation : je l'ai écrit.) Ou, si vous n'êtes pas déjà importateur de Guava, x == Math.rint(x) est le moyen le plus rapide de le faire ; rint est mesurablement plus rapide que floor o ceil .

3 votes

Je ne connaissais pas Math.rint Vous avez raison. C'est beaucoup plus rapide que Math.floor

0 votes

Est-ce que cela est préférable à l'exemple du moulage d'Eng.Fouad ?

1 votes

@JoelChristophel : Oui. Tous les doubles avec des valeurs entières ne sont pas dans la gamme des int, ou même des long, donc ce test ne fonctionnera pas sur eux.

28voto

Eng.Fouad Points 44085
public static boolean isInt(double d)
{
    return d == (int) d;
}

1 votes

Ne fonctionne que pour les valeurs dans le int gamme. Utilisation de long présente le même problème, mais avec une plage de travail plus large.

0 votes

J'ai adoré ! Merci.

1voto

maerics Points 47743
public static boolean isInteger(double d) {
  // Note that Double.NaN is not equal to anything, even itself.
  return (d == Math.floor(d)) && !Double.isInfinite(d);
}

0 votes

Une implémentation plus correcte renverrait false et vous devriez écrire une autre méthode qui prendrait int comme argument et renverrait true. :D

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X