Est-ce que j'ai râté quelque chose?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
Pourquoi ne.toFixed()
retourne une chaîne?
Je veux arrondir le nombre à 2 chiffres décimaux.
javascript
types
rounding
Derek Adair
la source
la source
Réponses:
Il renvoie une chaîne car 0,1 et ses puissances (qui sont utilisées pour afficher les fractions décimales) ne sont pas représentables (du moins pas avec une précision totale) dans les systèmes binaires à virgule flottante.
Par exemple, 0,1 est vraiment 0.1000000000000000055511151231257827021181583404541015625 et 0.01 est vraiment 0.01000000000000000020816681711721685132943093776702880859375. (Merci à d'
BigDecimal
avoir prouvé mon point. :-P)Par conséquent (en l'absence de virgule flottante décimale ou de type nombre rationnel), la sortie sous forme de chaîne est le seul moyen de l'ajuster exactement à la précision requise pour l'affichage.
la source
toFixed
s'agit d'une fonction de mise en forme, qui a pour seul but de convertir un nombre en chaîne, en le formatant en utilisant le nombre de décimales spécifié. La raison pour laquelle il renvoie une chaîne est parce qu'il est censé renvoyer une chaîne, et s'il était nommé à latoStringFixed
place, OP ne serait pas surpris des résultats. Le seul problème ici est que OP s'attendait à ce que cela fonctionne commeMath.round
, sans consulter la référence JS.Number.prototype.toFixed
est une fonction conçue pour formater un nombre avant de l'imprimer. C'est de la famille detoString
,toExponential
ettoPrecision
.Pour arrondir un nombre, procédez comme suit:
.
Ou si vous voulez une fonction « native », vous pouvez étendre le prototype:
Cependant , gardez à l'esprit que polluer le prototype est considéré comme mauvais lorsque vous écrivez un module, car les modules ne devraient pas avoir d'effets secondaires. Donc, pour un module, utilisez la première fonction .
la source
type Number
. Le fait est que+(anyValue)
renvoie toujours un nombre - par exemple.+("45")
revient45
,+(new Number(42))
revient42
. C'est un peu comme si vous tapiez fort la fonction. Si vous en prenez l'habitude, vous pouvez éviter beaucoup de bugs :)someNumber = Math.round( 42.008 * 1e2 ) / 1e2;
n'est pas42.01
, il est~42.0099999999999980
. Raison: Le nombre42.01
n'existe pas et est arrondi au nombre existant le plus proche. btw, éprouvez les numéros partoPrecision(18)
pour l'imprimer avec tous les chiffres pertinents.J'ai résolu ce problème en modifiant ceci:
...pour ça:
Cependant, cela convertira le nombre en chaîne et l'analysera à nouveau, ce qui aura un impact significatif sur les performances. Si vous vous souciez des performances ou de la sécurité du type, vérifiez également les autres réponses.
la source
someNumber = Math.round(someNumber * 1e2) / 1e2
! Voir ma réponse pour une manière plus générale.Pourquoi ne pas l'utiliser
parseFloat
?la source
Je l'ai résolu en le convertissant en nombre à l'aide de la
Number()
fonction JavaScriptla source
Bien sûr, il renvoie une chaîne. Si vous vouliez arrondir la variable numérique, vous utiliseriez plutôt Math.round (). Le but de toFixed est de formater le nombre avec un nombre fixe de décimales à afficher à l'utilisateur .
la source
Vous pouvez simplement utiliser un «+» pour convertir le résultat en nombre.
la source
Qu'attendriez-vous qu'il renvoie lorsqu'il est censé formater un nombre? Si vous avez un nombre, vous ne pouvez pas faire quoi que ce soit avec lui parce que, par exemple
2 == 2.0 == 2.00
, il doit s'agir d'une chaîne.la source
Pour fournir un exemple de pourquoi il doit s'agir d'une chaîne:
Si vous formatez 1. toFixed (2), vous obtiendrez «1,00».
Ce n'est pas la même chose que 1, car 1 n'a pas 2 décimales.
Je sais que JavaScript n'est pas exactement un langage de performance , mais il y a de fortes chances que vous obteniez de meilleures performances pour un arrondi si vous utilisez quelque chose comme: roundValue = Math.round (value * 100) * 0.01
la source
Parce que son utilisation principale est d'afficher des nombres? Si vous souhaitez arrondir les nombres, utilisez
Math.round()
avec des facteurs appropriés.la source
'42'
c'est un nombre ... ce qui n'est pas le cas. Le fait qu'une chaîne ne contienne que des chiffres n'en fait pas un nombre. Ce n'est pas PHP. :-PVoici une version légèrement plus fonctionnelle de la réponse
m93a
fournie.la source