Comment trouver qu'un nombre est float
ou integer
?
1.25 --> float
1 --> integer
0 --> integer
0.25 --> float
Comment trouver qu'un nombre est float
ou integer
?
1.25 --> float
1 --> integer
0 --> integer
0.25 --> float
vérifier s'il y a un reste lorsqu'on divise par 1 :
function isInt(n) {
return n % 1 === 0;
}
Si vous ne savez pas que l'argument est un nombre, vous avez besoin de deux tests :
function isInt(n){
return Number(n) === n && n % 1 === 0;
}
function isFloat(n){
return Number(n) === n && n % 1 !== 0;
}
Mise à jour 2019 5 ans après que cette réponse ait été écrite, une solution a été normalisée dans ECMA script 2015. Cette solution est couverte dans cette réponse .
Attention, cela retournera également vrai pour une chaîne vide, une chaîne représentant un nombre entier, true
, false
, null
Un tableau vide, un tableau contenant un seul nombre entier, un tableau contenant une chaîne de caractères représentant un nombre entier, et peut-être plus encore.
Je pense que votre première mise en œuvre est brillante et efficace et que la seconde est superflue. N'est-ce pas ?
Juste pour noter, cette méthode fonctionnera dans la plupart des cas, mais il ne suffit pas de supposer que l'inverse (!isInt) implique un float. Essayez-le contre un très grand nombre - !isInt(Number.MAX_VALUE-0.1)- il ne fonctionnera pas. Ceci est dû à l'utilisation du modulo. Les méthodes dans la réponse ci-dessous sera fonctionnent dans tous les cas.
Essayez ces fonctions pour vérifier si une valeur est une valeur primitive numérique qui n'a pas de partie fractionnaire et se situe dans les limites de taille de ce qui peut être représenté comme un nombre entier exact.
function isFloat(n) {
return n === +n && n !== (n|0);
}
function isInteger(n) {
return n === +n && n === (n|0);
}
heh awesom exploit, c'est à peu près le mien ( n===+n
pour vérifier le numérique, n|0
pour arrondir), mais avec des opérateurs intégrés. funky
John Hartsock : une chaîne de caractères ne sera jamais une valeur numérique. C'est une chaîne de caractères. Le but de cette fonction est de tester si une valeur est une valeur numérique Javascript qui n'a pas de partie fractionnaire et qui est dans les limites de taille de ce qui peut être représenté comme un entier exact. Si vous voulez vérifier une chaîne de caractères pour voir si elle contient une séquence de caractères qui représente un nombre, vous appelleriez parseFloat()
d'abord.
@Pointy mais parseFloat("1.1a") retournera toujours 1.1. Supposons que vous ayez un champ de texte dont vous voulez valider qu'il s'agit d'un float et seulement d'un float sans caractères alpha. Test du temps d'un champ texte à partir d'un élément d'entrée pour decimal(float)
Il existe une méthode appelée Number.isInteger()
qui est actuellement mis en œuvre dans tout sauf IE. MDN fournit également un polyfill pour les autres navigateurs :
Number.isInteger = Number.isInteger || function(value) {
return typeof value === 'number' &&
isFinite(value) &&
Math.floor(value) === value;
};
Cependant, pour la plupart des cas, il est préférable d'utiliser Number.isSafeInteger
qui vérifie également si la valeur est si élevée/basse que toute décimale aurait été perdue de toute façon. MDN a un polyfil pour cela aussi. (Vous avez également besoin du isInteger
pollyfill ci-dessus).
if (!Number.MAX_SAFE_INTEGER) {
Number.MAX_SAFE_INTEGER = 9007199254740991; // Math.pow(2, 53) - 1;
}
Number.isSafeInteger = Number.isSafeInteger || function (value) {
return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER;
};
C'est en fait le cœur d'une bonne solution pour moi. J'avais besoin d'autoriser les entiers positifs et d'interdire les flottants, les chaînes de caractères et les entiers négatifs.
Cela semble être une solution bien meilleure que les autres dans ce fil. La communauté pourrait-elle formuler des critiques, peut-être ?
var y = 1.00 ; y === parseInt(y, 10) ; // cela renvoie vrai pour moi, ce qui n'est pas vraiment ce que nous voulons.
Vous pouvez utiliser une simple expression régulière :
function isInt(value) {
var er = /^-?[0-9]+$/;
return er.test(value);
}
Vous pouvez également utiliser les fonctions ci-dessous, selon vos besoins. Elles sont développées par le Projet PHPJS .
is_int()
=> Vérifier si le type de la variable est un entier et si son contenu est un entier.
is_float()
=> Vérifier si le type de variable est float et si son contenu est float.
ctype_digit()
=> Vérifier si le type de variable est une chaîne de caractères et si son contenu ne comporte que des chiffres décimaux.
Mise à jour 1
Maintenant, il vérifie aussi les nombres négatifs, merci pour Commentaire de @ChrisBartley !
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.
52 votes
Je comprends ce que vous demandez ici, mais juste pour être clair :
<nit-pick>
JavaScript n'a pas de types numériques différents pour les entiers et les flottants. Chaque nombre en JavaScript est simplement unNumber
.</nit-pick>
4 votes
Est
Infinity
une valeur entière ou non entière en ce qui vous concerne ? Les réponses sont assez bien réparties sur ce point.13 votes
@MikeSamuel Pour être mathématiquement précis : puisque l'infini n'est pas un nombre réel et que tous les entiers sont des nombres réels,
Infinity
ne peut être considéré comme un nombre entier.0 votes
@rvighne, La question porte sur le "float", pas sur le "real". De toute façon, les réels ne sont pas pertinents car les ordinateurs ne peuvent représenter que nombres calculables .
0 votes
@MikeSamuel Désolé, je voulais dire des entiers. et flotteurs sont des nombres réels. Et de toute façon, j'ai dit que les ints et les floats sont partie de des nombres réels, pas qu'ils peuvent représenter tous les réels. En gros, ce que je veux dire, c'est que l'infini n'est pas un nombre et que vous ne devriez pas vous soucier de savoir si c'est un float ou un int.
2 votes
@rvighne, je pense que nous sommes d'accord que le fait que les infinis et NaN ne sont pas des nombres réels signifie que les flottants IEEE-754 ne sont pas un sous-ensemble des nombres réels. Toute analyse numérique basée sur IEEE-754 doit tenir compte de ce fait. Ce que je ne comprends pas, c'est comment vous pensez que ce fait détermine comment is_integral doit se comporter par rapport aux cardinalités. Personnellement, je pense que ((x % 1) == 0) est une bonne approximation et est entièrement spécifié par IEEE-754, donc il n'y a pas besoin de discuter des correspondances entre les différentes lignes de nombres.
0 votes
@Mike "L'opération "remainder" de l'IEEE 754 calcule le reste à partir d'une division d'arrondi, et non d'une division tronquée, et son comportement n'est donc pas analogue à celui de l'opérateur de reste des entiers habituels. Au lieu de cela, le langage ECMAScript définit % sur les opérations à virgule flottante pour qu'elles se comportent d'une manière analogue à celle de l'opérateur de reste d'entier de Java ; cela peut être comparé à la fonction fmod de la bibliothèque C." ecma-international.org/ecma-262/5.1
0 votes
Le comptage ne peut se faire qu'avec des entiers, donc l'infini dénombrable est un entier. nb Cantor a prouvé qu'il y a plus de nombres réels qu'un ensemble infini dénombrable. ( mathworld.wolfram.com/CountablyInfinite.html )
0 votes
Un bon document sur les spécifications de la virgule flottante. ece.uwaterloo.ca/~dwharder/NumericalAnalysis/02Numerics/Double/
0 votes
Vous pouvez utiliser la méthode des nombres
isInteger
. Vérifiez-le ici .0 votes
jsben.ch/#/htLVw - un point de référence pour les manières courantes de procéder
4 votes
Considérez-vous
1.0
nombre entier ou flottant ?