J'aimerais convertir un flottant en un nombre entier en JavaScript. En fait, j'aimerais savoir comment effectuer les DEUX conversions standard : en tronquant et en arrondissant. Et de manière efficace, pas en convertissant en une chaîne de caractères et en l'analysant.
Réponses
Trop de publicités?Vous pouvez utiliser le parseInt pour ne pas arrondir. Soyez prudent avec l'entrée utilisateur en raison des options de préfixe 0x (hex) et 0 (oct).
var intValue = parseInt(floatValue, 10);
EDIT : en tant que avertissement (à partir de la section des commentaires), veuillez noter que certaines valeurs numériques seront converties sous leur forme d'exposant, par exemple 1e21
ce qui entraîne une représentation décimale incorrecte de "1"
Dans votre cas, lorsque vous voulez une chaîne de caractères à la fin (afin d'insérer des virgules), vous pouvez aussi simplement utiliser la fonction Number.toFixed()
Toutefois, cette fonction permet d'effectuer des arrondis.
Une autre possibilité est d'utiliser l'opération XOR :
console.log(12.3 ^ 0); // 12
console.log("12.3" ^ 0); // 12
console.log(1.2 + 1.3 ^ 0); // 2
console.log(1.2 + 1.3 * 2 ^ 0); // 3
console.log(-1.2 ^ 0); // -1
console.log(-1.2 + 1 ^ 0); // 0
console.log(-1.2 - 1.3 ^ 0); // -2
La priorité des opérations sur les bits est inférieure à celle des opérations mathématiques, c'est utile. Essayez sur https://jsfiddle.net/au51uj3r/
A tronqué :
// Math.trunc() is part of the ES6 spec
console.log(Math.trunc( 1.5 )); // returns 1
console.log(Math.trunc( -1.5 )); // returns -1
// Math.floor( -1.5 ) would return -2, which is probably not what you wanted
A rond :
console.log(Math.round( 1.5 )); // 2
console.log(Math.round( 1.49 )); // 1
console.log(Math.round( -1.6 )); // -2
console.log(Math.round( -1.3 )); // -1
105 votes
Si vous ne le saviez pas, tous les nombres en javascript sont des flottants. De la spécification :
8 votes
4.3.20 Type de numéro : Le type Number est un ensemble de valeurs représentant des nombres. Dans l'ECMAScript, l'ensemble de valeurs représente les valeurs IEEE 754 en double précision sur 64 bits, y compris les valeurs spéciales "Not-a-Number" (NaN), l'infini positif et l'infini négatif.
13 votes
Oui, Javascript ne dispose pas d'un type "entier" distinct, mais il n'est pas rare de devoir effectuer cette conversion. Par exemple, dans mon application, les utilisateurs ont tapé un nombre (incluant éventuellement des centimes). Je devais tronquer les centimes et les afficher avec des virgules. L'étape 1 consistait à convertir en int.
1 votes
Également utile : comparaison de la vitesse de toutes les méthodes jsperf.com/math-floor-vs-math-round-vs-parseint/33
0 votes
@mcherm pourquoi ne pas piéger le caractère décimal et ne pas autoriser son utilisation ? N'est-ce pas une meilleure expérience pour l'utilisateur ? De plus, si votre code ne permet à l'utilisateur que de saisir [0..9], vous n'avez pas besoin de convertir en entier. Cette question reste utile.
1 votes
@karl : Si j'accepte une entrée dans un champ, je pourrais être en mesure de contrôler les caractères que j'accepte, mais je pourrais effectuer toutes sortes de traitements en Javascript, et pas seulement accepter l'entrée de l'utilisateur. Même dans ce cas, je pourrais en avoir besoin pour des choses comme le support du collage.