269 votes

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

Suis-je en train de rater quelque chose ici?

var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string

Pourquoi .toFixed() retourne une chaîne de caractères?

Je veux arrondir le nombre à 2 chiffres décimaux.

12 votes

Parce qu'il est conçu pour renvoyer une chaîne de caractères?

6 votes

À mes yeux, cela semble juste bizarre. .toFixed() ne fonctionne que sur les nombres... n'est-ce pas ?

20 votes

Je comprends que Math.round() fonctionne comme prévu. Je me demandais simplement pourquoi une fonction qui opère sur des nombres renvoie une chaîne de caractères...

161voto

Eve juan Points 131

J'ai résolu ce problème en changeant ceci :

someNumber = someNumber.toFixed(2)

...à ceci :

someNumber = +someNumber.toFixed(2);

Cependant, cela convertira le nombre en chaîne de caractères et le parse à nouveau, ce qui aura un impact significatif sur les performances. Si vous vous souciez des performances ou de la sécurité des types, vérifiez également les autres réponses.

58 votes

Non, non, non, non, non! Ne fais pas ça! La conversion de nombre en chaîne juste pour l'arrondir est une pratique très mauvaise! Au lieu de cela, faites someNumber = Math.round(someNumber * 1e2) / 1e2! Consultez ma réponse pour une méthode plus généralisée.

0 votes

@m93a - pourquoi est-ce une si mauvaise pratique?

3 votes

@jczaplew Parce que si vous le faites de cette façon, le nombre binaire de 32 bits est converti en une chaîne de caractères, en utilisant 16 bits pour chaque foutu chiffre décimal ! (Au fait, stocker des nombres en UTF-16 n'est pas la chose la plus pratique à faire.) Et puis la chaîne de caractères est reconvertie en un nombre flottant 32 bits. Chiffre par chiffre. (Si j'ignore tous les tests qui doivent être effectués avant de choisir le bon algorithme d'analyse.) Et tout cela en vain compte tenu du fait que vous pouvez le faire en utilisant 3 opérations rapides sur le flottant.

147voto

Chris Jester-Young Points 102876

Il renvoie une chaîne de caractères car 0,1 et ses puissances (qui sont utilisées pour afficher des fractions décimales) ne sont pas représentables (du moins pas avec une précision totale) dans les systèmes à virgule flottante binaires.

Par exemple, 0,1 est en réalité 0,1000000000000000055511151231257827021181583404541015625, et 0,01 est en réalité 0,01000000000000000020816681711721685132943093776702880859375. (Merci à BigDecimal d'avoir prouvé mon point. :-P)

Par conséquent (en l'absence d'un type de point flottant décimal ou de nombre rationnel), le renvoyer en tant que chaîne de caractères est le seul moyen de l'obtenir tronqué à exactement la précision requise pour l'affichage.

46 votes

Au moins JavaScript pourrait me faire économiser un peu de travail et le convertir en un numéro... pfff...

13 votes

@Derek: Oui, mais une fois converti en nombre, vous rencontrez à nouveau les mêmes problèmes d'inexactitude. :-P JS n'a pas de nombres flottants décimaux ou rationnels.

1 votes

@DerekAdair J'ai récemment écrit un post qui explique cela encore plus en détail, qui pourrait vous intéresser. Profitez-en! stackoverflow.com/a/27030789/13

16voto

Joel Coehoorn Points 190579

Bien sûr, cela retourne une chaîne de caractères. Si vous souhaitez arrondir la variable numérique, vous utiliserez Math.round() à la place. Le but de toFixed est de formater le nombre avec un nombre fixe de décimales pour l'affichage à l'utilisateur.

13voto

Buenjy Points 71

Le '+' analyse votre chaîne en nombre

someNumber = +(someNumber).toFixed(2);

3voto

Tomas Vana Points 5686

Que vous attendriez-vous qu'il retourne lorsqu'il est censé formater un nombre ? Si vous avez un nombre, vous ne pouvez pas faire grand-chose avec car par exemple, 2 == 2.0 == 2.00, etc., il doit donc être une chaîne de caractères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X