Je voudrais convertir un flotteur en nombre entier en JavaScript. En fait, j'aimerais savoir comment faire les DEUX conversions standard: en tronquant et en arrondissant. Et efficacement, pas via la conversion en chaîne et l'analyse.
javascript
syntax
mcherm
la source
la source
Réponses:
Référence d'objet mathématique
Exemples
Positif Négatif Positif - Plus grand nombre Négatif - Plus grand nombrela source
var intValue = ~~floatValue;
. Si la notation est trop obscure pour vos goûts, juste le cacher dans une fonction:function toInt(value) { return ~~value; }
. (Cela convertit également les chaînes en entiers, si vous le souhaitez.)Math.trunc(val);
commenter car c'est la réponse acceptée2.3 - 2.3 % 1
Opérateur OR au niveau du bit
Un opérateur au niveau du bit ou peut être utilisé pour tronquer les chiffres à virgule flottante et cela fonctionne pour les positifs comme pour les négatifs:
Résultats
Comparaison des performances?
J'ai créé un test JSPerf qui compare les performances entre:
Math.floor(val)
val | 0
au niveau du bit OU au niveau du~~val
au niveau du bit pas au niveau duparseInt(val)
cela ne fonctionne qu'avec des nombres positifs. Dans ce cas, vous pouvez utiliser les opérations au niveau du bit et la
Math.floor
fonction en toute sécurité .Mais si vous avez besoin de votre code pour travailler avec les positifs comme les négatifs , alors une opération au niveau du bit est la plus rapide (OU étant la préférée). Cet autre test JSPerf compare le même où il est assez évident qu'en raison du contrôle de signe supplémentaire, Math est maintenant le plus lent des quatre.
Remarque
Comme indiqué dans les commentaires, les opérateurs BITWISE fonctionnent sur des entiers 32 bits signés, donc les grands nombres seront convertis, par exemple:
la source
Math.floor()
est plus rapide (au moins selon mon exécution de votre premier test JSPerf sur Google Chrome, version 30.0.1599.101), plus robuste (car cela ne dépend pas de la façon dont les nombres sont représentés en bits, qui peut changer et éventuellement casser cette solution au niveau du bit), et surtout, plus explicite.~~
c'est mieux car c'est un opérateur unaire.4.2|0+4
égal4
mais~~4.2+4
égal8
Remarque: Vous ne pouvez pas utiliser
Math.floor()
comme remplacement de tronquer, carMath.floor(-3.1) = -4
et non-3
!!Un remplacement correct pour tronquer serait:
la source
Math.trunc(value)
a été ajouté dans ECMAScript 6floor
arrondit vers -infini,truncate
arrondit vers zéro. (ceil
arrondit vers + infini).Un double opérateur pas au niveau du bit peut être utilisé pour tronquer les flottants. Les autres opérations que vous avez mentionnés sont disponibles à travers
Math.floor
,Math.ceil
etMath.round
.Plus de détails gracieuseté de James Padolsey.
la source
<canvas>
moteur de rendu de polices dans JS . Je vous remercie!Pour tronquer:
Pour ronde:
la source
Vous pouvez utiliser la méthode parseInt pour aucun arrondi. Soyez prudent avec l'entrée utilisateur en raison des options de préfixe 0x (hex) et 0 (octal).
la source
parseInt(1000000000000000000000, 10);
donne 1, pas 1 000 000 000 000 000 000 000 000. Quoi qu'il en soit, la question ne voulait pas explicitement " convertir en chaîne et analyser ", bien que ce soit relativement mineur ...;)parseInt()
attend une chaîne et non un nombre comme premier paramètre. Lorsque vous passez cet entier, il est converti en1e21
puisparseInt
analyse la chaîne1e21
, ce qui se traduit par1
.Décalage de bits de 0, ce qui équivaut à une division de 1
la source
>> 0
semble fonctionner uniquement pour les entiers < 2 ^ 31-1 , et>>> 0
pour les entiers < 2 ^ 32-1 . Cela renvoie 0 pour des valeurs plus grandesDans votre cas, lorsque vous voulez une chaîne à la fin (afin d'insérer des virgules), vous pouvez également simplement utiliser la
Number.toFixed()
fonction, cependant, cela effectuera l'arrondi.la source
Il y a de nombreuses suggestions ici. L'OR au niveau du bit semble de loin le plus simple. Voici une autre solution courte qui fonctionne également avec des nombres négatifs en utilisant l'opérateur modulo. Il est probablement plus facile à comprendre que le bit à bit OU:
Cette méthode fonctionne également avec des nombres de valeur élevée où ni '| 0' ni '~~' ni '>> 0' ne fonctionnent correctement:
la source
Pour tronquer :
Pour arrondir :
la source
Une autre façon possible - utilisez l'opération XOR:
La priorité des opérations au niveau du bit est inférieure à la priorité des opérations mathématiques, c'est utile. Essayez sur https://jsfiddle.net/au51uj3r/
la source
Si regardez en natif
Math
objet en JavaScript, vous obtenez tout le tas de fonctions pour travailler sur les nombres et les valeurs, etc.Fondamentalement, ce que vous voulez faire est assez simple et natif en JavaScript ...
Imaginez que vous avez le numéro ci-dessous:
et maintenant si vous voulez l'arrondir au nombre le plus proche, faites simplement:
et vous obtenez:
Si vous voulez l'arrondir au nombre le plus proche, faites simplement:
et vous obtenez:
De
Math.round
même, l'arrondir à un nombre supérieur ou inférieur dépend de celui qui est le plus proche du nombre de flots.Vous pouvez également utiliser
~~
derrière le nombre flottant, qui convertira un flotteur en nombre entier.Vous pouvez l'utiliser comme
~~myValue
...la source
~~
car, si le nombre est supérieur à la limite int 32, il changera la valeur en valeur limite int 32.la source
Je veux juste souligner que monétairement, vous voulez arrondir, et non tronquer. Être hors d'un sou est beaucoup moins probable, car 4,999452 * 100 arrondi vous donnera 5, une réponse plus représentative.
Et en plus de cela, n'oubliez pas l'arrondi bancaire , qui est un moyen de contrer le biais légèrement positif que donne l'arrondi simple - votre application financière peut l'exiger.
Arrondi gaussien / banquier en JavaScript
la source
Si vous utilisez angularjs, une solution simple comme suit dans la liaison de modèles HTML
{{val | number:0}}
il convertira val en entier
passer par ce lien docs.angularjs.org/api/ng/filter/number
la source