web-dev-qa-db-fra.com

Comment puis-je arrondir un nombre en JavaScript? .toFixed () retourne une chaîne?

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. 

125
Derek Adair

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.

101
Chris Jester-Young

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

112
m93a

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.

104
Eve juan

Pourquoi ne pas utiliser parseFloat ?

var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number
21
sirlunchalot

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 .

13
Joel Coehoorn

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));
11
Nizar

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.

3
Tomas Vana

Vous pouvez simplement utiliser un '+' pour convertir le résultat en nombre.

var x = 22.032423;
x = +x.toFixed(2); // x = 22.03
3
meisam

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
1
Sartaj

Parce que son utilisation principale est l'affichage de nombres? Si vous voulez arrondir les nombres, utilisez Math.round() avec les facteurs appropriés.

1
Christoph

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:.

0
Pyro