502 votes

Comment formater un flottant en javascript ?

En JavaScript, lors de la conversion d'un flottant en chaîne de caractères, comment puis-je obtenir seulement 2 chiffres après la virgule ? Par exemple, 0,34 au lieu de 0,3445434.

21 votes

Juste un petit détail : voulez-vous "couper" tout sauf les deux premiers chiffres, ou voulez-vous arrondir à deux chiffres ?

963voto

Tim Büthe Points 21527

Il existe des fonctions permettant d'arrondir les chiffres. Par exemple :

var x = 5.0364342423;
print(x.toFixed(2));

imprimera 5.04.

EDIT : Violon

13 votes

Je vous déconseille cependant d'utiliser print() dans un navigateur.

1 votes

D'accord, bon point, mais personne n'a dit que cela fonctionnerait dans un navigateur :)

2 votes

@Berov : ce n'est pas vrai, voir mon violon.

260voto

kkyy Points 5540
var result = Math.round(original*100)/100;

Les spécificités au cas où le code ne serait pas explicite.

edit : ...ou simplement utiliser [toFixed](http://www.pageresource.com/jscript/j%5Fa%5F03.htm) comme proposé par Tim Büthe . J'avais oublié celui-là, merci (et une upvote) pour le rappel :)

1 votes

Je l'utilisais dans la bibliothèque "Highchart" qui n'accepte pas les valeurs de chaîne de caractères, donc toFixed ne fonctionnait pas pour moi, Math.round a résolu mon problème, merci.

6 votes

toFixed() imitera ce que quelque chose comme printf() fait en C. Cependant, toFixed() et Math.round() traitera les arrondis différemment. Dans ce cas, toFixed() aura le même genre d'effet Math.floor() l'aurait fait (en admettant que vous multipliez l'original par 10^n au préalable, et en appelant toFixed() avec n chiffres). La "justesse" de la réponse dépend beaucoup de ce que le PO veut ici, et les deux sont "justes" à leur manière.

2 votes

La méthode proposée ici n'est malheureusement pas bonne, car elle peut donner des valeurs inattendues comme 4.99999999998 etc, à cause du fonctionnement de la base binaire. Veuillez utiliser toFixed à la place.

196voto

Christoph Points 64389

Soyez prudent lorsque vous utilisez toFixed() :

Premièrement, l'arrondi du nombre est effectué en utilisant la représentation binaire du nombre, ce qui peut entraîner un comportement inattendu. Par exemple

(0.595).toFixed(2) === '0.59'

au lieu de '0.6' .

Deuxièmement, il y a un bug d'IE avec toFixed() . Dans IE (au moins jusqu'à la version 7, je n'ai pas vérifié IE8), la règle suivante s'applique :

(0.9).toFixed(0) === '0'

Il peut être judicieux de suivre la suggestion de kkyy ou d'utiliser un fichier personnalisé toFixed() fonction, par exemple

function toFixed(value, precision) {
    var power = Math.pow(10, precision || 0);
    return String(Math.round(value * power) / power);
}

0 votes

Oui, cela peut être très important lors de la création de code pour prédire les prix. Merci ! +1

13 votes

Je suggère d'ajouter l'élément natif .toFixed() dans la valeur de retour, qui ajoutera le degré de précision requis, par exemple : return (Math.round(value * power) / power).toFixed(precision); et renvoie également la valeur sous forme de chaîne. Sinon, la précision de 20 est ignorée pour les petites décimales.

3 votes

Une remarque concernant toFixed : notez que l'augmentation de la précision peut donner des résultats inattendus : (1.2).toFixed(16) === "1.2000000000000000" alors que (1.2).toFixed(17) === "1.19999999999999996" (dans Firefox/Chrome ; dans IE8, ce dernier ne tient pas en raison de la précision inférieure que IE8 peut offrir en interne).

12voto

Ilya Birman Points 2996
var x = 0.3445434
x = Math.round (x*100) / 100 // this will make nice rounding

0 votes

Math.round(1.015 * 100) / 100 donne 1.01 alors que l'on s'attendrait à 1.02 ?

6voto

ArteQ Points 29

Il y a un problème avec toutes ces solutions qui circulent en utilisant des multiplicateurs. Les solutions de kkyy et de Christoph sont toutes deux fausses, malheureusement.

Veuillez tester votre code pour le nombre 551.175 avec 2 décimales - il arrondira à 551.17 alors qu'il devrait être 551.18 ! Mais si vous testez par ex. 451.175 il sera ok - 451.18. Il est donc difficile de repérer cette erreur au premier coup d'œil.

Le problème est avec la multiplication : essayez 551.175 * 100 = 55117.49999999999 (ups !)

Mon idée est donc de le traiter avec toFixed() avant d'utiliser Math.round() ;

function roundFix(number, precision)
{
    var multi = Math.pow(10, precision);
    return Math.round( (number * multi).toFixed(precision + 1) ) / multi;
}

2 votes

C'est le problème avec l'arithmétique en JS : (551.175 * 10 * 10) !== (551.175 * 100). Vous devez utiliser des incréments décimaux pour déplacer la virgule pour les résultats décimaux non réels.

0 votes

+1 pour avoir remarqué cela, cependant toFixed est également affecté - (0.335).toFixed(2) == 0.34 == (0.345).toFixed(2) Quelle que soit la méthode utilisée, il vaut mieux ajouter un epsilon avant l'arrondi.

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