Convertir un double en int en Javascript sans arrondi
En C# le code suivant renvoie 2:
double d = 2.9;
int i = (int)d;
Debug.WriteLine(i);
En Javascript, cependant, le seul moyen de la conversion d'un "double" d'un "int" que je suis conscient, c'est par l'utilisation des Mathématiques.tour/sol/toFixed etc. Est-il un moyen de convertir un int en Javascript sans arrondi? Je suis conscient des implications sur les performances de Nombre() donc je préfère éviter de convertir une chaîne si possible.
- Pourquoi avez-vous écarter
Math.floor
? - Les réponses que vous conseiller d'utiliser "parseInt()" peut tous convertir une chaîne en interne d'abord, parce que c'est ce "parseInt()" attend. Vraiment, que ce soit des Mathématiques".floor()" ou encore "~~num" (le double "non" opération) sera tronquée, votre double précision de la valeur d'un entier.
- Il a probablement règles
Math.floor
parce qu'il se comporte de façon différente pour les nombres négatifs. ComparerMath.floor(-2.5)
et-2.5|0
. - Jeter la partie fractionnaire est TOUJOURS arrondi, par définition. Vous voulez probablement:
rounding towards zero.
Vous devez vous connecter pour publier un commentaire.
Utilisation
parseInt()
.Vous pouvez également utiliser
|
.parseInt
, j'ai donc utilisé la deuxième option. Merci!- Je trouver le "parseInt" suggestions pour être assez curieux, parce que "parseInt" fonctionne sur chaînes de par leur conception. C'est pourquoi son nom est le mot "analyser" en elle.
Un truc qui évite un appel de fonction est entièrement
La double application de l' "~" opérateur unaire vous laisse avec une version tronquée d'une valeur à double précision. Toutefois, la valeur est limitée à 32 bits de précision, comme avec tous les autres JavaScript opérations qui, implicitement, comporter nombres entiers (comme le tableau d'indexation et les opérateurs au niveau du bit).
modifier — Dans une mise à jour tout à fait un peu plus tard, une autre alternative à la
~~
truc, c'est de bit-à-bit-OU de la valeur à zéro:~~
et|0
) en JavaScript, et certainement mieux queparseInt()
qui fait vraiment aucun sens. JavaScript n'est pas vraiment entiers, sauf dans la forme transitoire au moyen d'expressions impliquant des opérateurs binaires.Suffit d'utiliser
parseInt()
et assurez-vous d'inclure la base de sorte que vous obtenez des résultats prévisibles:Il n'y a pas une telle chose comme un
int
en Javascript. Tous lesNumbers
sont en fait des doubles en coulisses* si vous ne pouvez pas compter sur le système de type de délivrer un arrondissement afin de vous comme vous le pouvez dans le C ou le C#.Vous n'avez pas besoin de s'inquiéter au sujet de la précision des questions (car double représenter correctement tout entier jusqu'à 2^53), mais vous êtes vraiment coincé avec l'aide des Mathématiques.sol (ou l'équivalent de trucs) si vous voulez arrondir à l'entier le plus proche.
*La plupart des JS utilisation de moteurs de native ints quand ils le peuvent, mais dans l'ensemble JS numéros doivent toujours avoir le double de la sémantique.
Similaire à C# casting pour
(int)
avec juste en utilisant la lib standard:Comme @Quentin et @Pointues ont souligné dans leurs commentaires, ce n'est pas une bonne idée d'utiliser
parseInt()
car il est conçu pour convertir une chaîne en un entier. Lorsque vous passez un nombre décimal, il convertit le nombre en une chaîne de caractères, puis il jette à un entier. Je vous suggère d'utiliserMath.trunc()
,Math.floor()
,~~num
,~~v
,num | 0
,num << 0
, ounum >> 0
en fonction de vos besoins.Ce test de performance montre la différence de
parseInt()
etMath.floor()
performance.Aussi, ce post explique la différence entre les méthodes proposées.