Est-ce que j'ai râté quelque chose?
var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string
Pourquoi.toFixed()
renvoie-t-il une chaîne?
Je veux arrondir le nombre à 2 chiffres décimaux.
Il retourne une chaîne car 0.1 et ses puissances (utilisées pour afficher les fractions décimales) ne sont pas représentables (du moins pas avec une précision absolue) dans les systèmes à virgule flottante binaire.
Par exemple, 0,1 correspond en réalité à 0.1000000000000000055511151231257827021181583404541015625 et 0.01 correspond en réalité à 0.010000000000000000008166817117216851329430937762828859375. (Merci à BigDecimal
pour avoir prouvé ce que je voulais dire. :-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 le rogner exactement à la précision requise pour l'affichage.
Number.prototype.toFixed
est une fonction conçue pour formater un nombre avant de l'imprimer. Cela vient de la famille de toString
, toExponential
et toPrecision
.
Pour arrondir un nombre, procédez comme suit:
someNumber = 42.008;
someNumber = Math.round( someNumber * 1e2 ) / 1e2;
someNumber === 42.01;
// if you need 3 digits, replace 1e2 with 1e3 etc.
.
Ou si vous voulez une fonction native-like, vous êtes ici:
Number.prototype.toFixedNumber = function(x, base){
var pow = Math.pow(base||10,x);
return Math.round(this*pow) / pow;
}
someNumber = 42.008;
someNumber = someNumber.toFixedNumber(2);
someNumber === 42.01;
//or even hexadecimal
someNumber = 0xAF309/256 //which is af3.09
someNumber = someNumber.toFixedNumber(1, 16);
someNumber.toString(16) === "af3.1";
.
Tho Je n'aime pas trop Jsperf. Voici un lien avec la comparaison de la méthode utilisant la conversion (dans d'autres réponses) et celle-ci:
https://jsperf.com/rounding-a-number-2
J'ai résolu ce problème en modifiant ceci:
someNumber = someNumber.toFixed(2)
...pour ça:
someNumber = +someNumber.toFixed(2);
Cependant, cela convertira le nombre en chaîne et le réanalysera, ce qui aura un impact significatif sur les performances. Si vous vous souciez de la performance ou du type de sécurité, vérifiez également les autres réponses.
Pourquoi ne pas utiliser parseFloat
?
var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
Bien sûr, il retourne une chaîne. Si vous voulez arrondir la variable numérique, utilisez plutôt Math.round (). Le point toFixed est de formater le nombre avec un nombre fixe de décimales pour l’afficher à l’utilisateur .
Je l'ai résolu en le reconvertissant en nombre à l'aide de la fonction Number()
de JavaScript.
var x = 2.2873424;
x = Number(x.toFixed(2));
Qu'attendriez-vous qu'il retourne lorsqu'il est supposé formater un nombre? Si vous avez un numéro, vous ne pouvez pratiquement rien y faire, car par exemple .2 == 2.0 == 2.00
etc.
Vous pouvez simplement utiliser un '+' pour convertir le résultat en nombre.
var x = 22.032423;
x = +x.toFixed(2); // x = 22.03
Voici une version légèrement plus fonctionnelle de la réponse fournie par m93a
.
const toFixedNumber = (toFixTo = 2, base = 10) => num => {
const pow = Math.pow(base, toFixTo)
return +(Math.round(num * pow) / pow)
}
const oneNumber = 10.12323223
const result1 = toFixedNumber(2)(oneNumber) // 10.12
const result2 = toFixedNumber(3)(oneNumber) // 10.123
// or using pipeline-operator
const result3 = oneNumber |> toFixedNumber(2) // 10.12
Parce que son utilisation principale est l'affichage de nombres? Si vous voulez arrondir les nombres, utilisez Math.round()
avec les facteurs appropriés.
Pour donner un exemple de la raison pour laquelle 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 vraiment une performance langue, mais vous obtiendrez probablement de meilleures performances pour un arrondi si vous utilisez quelque chose comme:.