web-dev-qa-db-fra.com

Conversion d'un double en un int en Javascript sans arrondir

En C #, le code suivant renvoie 2:

double d = 2.9;
int i = (int)d;
Debug.WriteLine(i);

Cependant, en Javascript, le seul moyen de convertir un "double" en un "int" est d'utiliser Math.round/floor/toFixed etc. Existe-t-il un moyen de convertir un int en Javascript sans arrondir ? Je suis conscient des implications de Number () sur les performances, je préfère donc éviter de le convertir en chaîne si possible.

47
RSH1

Utilisez parseInt().

var num = 2.9
console.log(parseInt(num, 10)); // 2

Vous pouvez également utiliser |.

var num = 2.9
console.log(num | 0); // 2
115
kubetz

Je trouve les suggestions "parseInt" assez curieuses, car "parseInt" opère sur chaînes de par leur conception. C'est pourquoi son nom contient le mot "analyser".

Un truc qui évite entièrement un appel de fonction est

var truncated = ~~number;

La double application de l'opérateur unaire "~" vous laissera une version tronquée d'une valeur double précision. Cependant, la valeur est limitée à une précision de 32 bits, comme pour toutes les autres opérations JavaScript impliquant implicitement de considérer les nombres comme des entiers (comme l'indexation de tableau et les opérateurs au niveau du bit).

edit - Dans une mise à jour un peu plus tard, une autre alternative à l'astuce ~~ est de bitwise-OU la valeur avec zéro:

var truncated = number|0;
47
Pointy

Utilisez simplement parseInt() et assurez-vous d'inclure la base afin d'obtenir des résultats prévisibles:

parseInt(d, 10);
7
Justin Niessner

int en Javascript n'existe pas. Tous les Numbers sont en réalité des doublons en coulisse *. Vous ne pouvez donc pas vous fier au système de typage pour émettre un ordre d'arrondi comme vous le pouvez en C ou C #.

Vous n'avez pas à vous soucier des problèmes de précision (puisque les doublons représentent correctement tout entier allant jusqu'à 2 ^ 53), mais vous êtes vraiment coincé avec Math.floor (ou d'autres astuces équivalentes) si vous voulez arrondir à l'entier le plus proche.


* La plupart des moteurs JS utilisent des ints natifs quand ils le peuvent, mais tous les numéros JS doivent toujours avoir une double sémantique.

5
hugomg

Similaire à la conversion en C # en (int) avec juste l'utilisation de lib standard:

Math.trunc(1.6) // 1
Math.trunc(-1.6) // -1
1
Roland

Comme @Quentin et @Pointy l'ont souligné dans leurs commentaires, utiliser parseInt() n'est pas une bonne idée, car il est conçu pour convertir une chaîne en un entier. Lorsque vous lui passez un nombre décimal, il convertit d'abord le nombre en chaîne, puis le convertit en un entier. Je vous suggère d'utiliser Math.trunc(), Math.floor(), ~~num, ~~v, num | 0, num << 0, ou num >> 0 en fonction de vos besoins . Ce test de performance montre la différence entre les performances de parseInt() et Math.floor() . En outre, this post explique la différence entre les méthodes proposées.

0
1man