Suis-je le seul à avoir lu cette question et à avoir réalisé qu'aucune des réponses n'abordait la partie "entier" de la question ?
Le problème
var myInteger = 6;
var myFloat = 6.2;
if( myInteger > 0 )
// Cool, we correctly identified this as a positive integer
if( myFloat > 0 )
// Oh, no! That's not an integer!
La solution
Pour garantir que vous avez affaire à un nombre entier, vous devez convertir votre valeur en un nombre entier, puis le comparer à lui-même.
if( parseInt( myInteger ) == myInteger && myInteger > 0 )
// myInteger is an integer AND it's positive
if( parseInt( myFloat ) == myFloat && myFloat > 0 )
// myFloat is NOT an integer, so parseInt(myFloat) != myFloat
Quelques optimisations intéressantes
En prime, il existe des raccourcis pour convertir un flottant en entier en JavaScript. . En JavaScript, tous les opérateurs binaires ( |
, ^
, &
etc) transformeront votre nombre en un entier avant de l'utiliser. Je suppose que c'est parce que 99% des développeurs ne connaissent pas la norme IEEE de virgule flottante et seraient terriblement confus si "200 | 2" était évalué à 400(ish). Ces raccourcis ont tendance à courir plus vite que Math.floor
o parseInt
et ils occupent moins d'octets si vous essayez d'obtenir le plus petit code possible :
if( myInteger | 0 == myInteger && myInteger > 0 )
// Woot!
if( myFloat | 0 == myFloat && myFloat > 0 )
// Woot, again!
Mais attendez, il y a plus !
Ces opérateurs bit à bit fonctionnent sur des entiers signés de 32 bits. Cela signifie que le bit le plus élevé est le bit de signe. En forçant le bit de signe à zéro, votre nombre restera inchangé. seulement si c'était positif . Vous pouvez l'utiliser pour vérifier la positivité ET l'intégrité en un seul coup :
// Where 2147483647 = 01111111111111111111111111111111 in binary
if( (myInteger & 2147483647) == myInteger )
// myInteger is BOTH positive and an integer
if( (myFloat & 2147483647) == myFloat )
// Won't happen
* note bit AND operation is wrapped with parenthesis to make it work in chrome (console)
Si vous avez du mal à vous souvenir de ce chiffre alambiqué, vous pouvez aussi le calculer à l'avance comme tel :
var specialNumber = ~(1 << 31);
Vérification des négatifs
Conformément au commentaire de @Reinsbrain, un piratage bit à bit similaire peut être utilisé pour vérifier la présence d'un négatif entier. Dans un nombre négatif, on faire veulent que le bit le plus à gauche soit un 1, donc en forçant ce bit à 1, le nombre ne restera inchangé que s'il était négatif au départ :
// Where -2147483648 = 10000000000000000000000000000000 in binary
if( (myInteger | -2147483648) == myInteger )
// myInteger is BOTH negative and an integer
if( (myFloat | -2147483648) == myFloat )
// Won't happen
Ce chiffre spécial est encore plus facile à calculer :
var specialNumber = 1 << 31;
Cas limites
Comme nous l'avons mentionné précédemment, puisque les opérateurs bitwise JavaScript sont convertis en nombres entiers 32 bits, les nombres qui ne tiennent pas sur 32 bits (supérieurs à ~2 milliards) échoueront.
Vous pouvez vous rabattre sur la solution longue pour ces derniers :
if( parseInt(123456789000) == 123456789000 && 123456789000 > 0 )
Cependant, même cette solution échoue à un moment donné, car parseInt
est limitée dans sa précision pour les grands nombres. Essayez ce qui suit et voyez ce qui se passe :
parseInt(123123123123123123123); // That's 7 "123"s
Sur mon ordinateur, dans la console Chrome, cela sort : 123123123123123130000
La raison en est que parseInt traite l'entrée comme un flottant IEEE 64 bits. Cela ne fournit que 52 bits pour la mantisse, ce qui signifie une valeur maximale de ~4.5e15 avant de commencer à arrondir.