En JavaScript, lors de la conversion d'un flottant en une chaîne, comment puis-je obtenir seulement 2 chiffres après la virgule décimale? Par exemple, 0,34 au lieu de 0,3445434.
427
En JavaScript, lors de la conversion d'un flottant en une chaîne, comment puis-je obtenir seulement 2 chiffres après la virgule décimale? Par exemple, 0,34 au lieu de 0,3445434.
Réponses:
Les détails , au cas où le code ne serait pas explicite.
modifier: ... ou tout simplement utiliser
toFixed
, comme proposé par Tim Büthe . Oublié celui-là, merci (et un vote positif) pour rappel :)la source
toFixed()
imitera ce que fait quelque choseprintf()
en C. Cependant,toFixed()
etMath.round()
gérera l'arrondi différemment. Dans ce cas,toFixed()
aura le même type d'effetMath.floor()
(à condition de multiplier l'original par 10 ^ n au préalable et d'appelertoFixed()
avec n chiffres). La «justesse» de la réponse dépend beaucoup de ce que le PO souhaite ici, et les deux sont «correctes» à leur manière.Il existe des fonctions pour arrondir les nombres. Par exemple:
imprimera 5.04.
EDIT: Fiddle
la source
var x = 5.036432346; var y = x.toFixed(2) + 100;
y
sera égale"5.03100"
(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
…Soyez prudent lorsque vous utilisez
toFixed()
:Tout d'abord, l'arrondi du nombre est effectué à l'aide de la représentation binaire du nombre, ce qui peut entraîner un comportement inattendu. Par exemple
au lieu de
'0.6'
.Deuxièmement, il y a un bogue IE avec
toFixed()
. Dans IE (au moins jusqu'à la version 7, n'a pas vérifié IE8), ce qui suit est vrai:Il peut être judicieux de suivre la suggestion de kkyy ou d'utiliser une
toFixed()
fonction personnalisée , par exemplela source
.toFixed()
méthode native dans la valeur de retour, ce qui ajoutera la précision requise, par exemple:return (Math.round(value * power) / power).toFixed(precision);
et renverra également la valeur sous forme de chaîne. Sinon, la précision de 20 est ignorée pour les décimales plus petitestoFixed
: notez que l'augmentation de la précision peut donner des résultats inattendus:,(1.2).toFixed(16) === "1.2000000000000000"
tandis 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 qu'IE8 peut offrir en interne).(0.598).toFixed(2)
ne produit pas0.6
. Il produit0.60
:)(0.335).toFixed(2) == 0.34 == (0.345).toFixed(2)
.Un autre problème à prendre en compte est qu'il
toFixed()
peut produire des zéros inutiles à la fin du nombre. Par exemple:L'idée est de nettoyer la sortie en utilisant
RegExp
:Le
RegExp
correspond aux zéros de fin (et éventuellement le point décimal) pour s'assurer qu'il semble également bon pour les entiers.la source
la source
Il y a un problème avec toutes ces solutions flottant à l'aide de multiplicateurs. Malheureusement, les solutions de Kkyy et de Christoph sont fausses.
Veuillez tester votre code pour le numéro 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 ce sera ok - 451.18. Il est donc difficile de repérer cette erreur à première vue.
Le problème est avec la multiplication: essayez 551.175 * 100 = 55117.49999999999 (ups!)
Donc mon idée est de le traiter avec toFixed () avant d'utiliser Math.round ();
la source
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.La clé ici, je suppose, consiste à arrondir correctement d'abord, puis vous pouvez le convertir en chaîne.
Vous pouvez maintenant formater cette valeur en toute sécurité avec toFixed (p). Donc, avec votre cas spécifique:
la source
Si vous voulez la chaîne sans rond, vous pouvez utiliser ce RegEx (ce n'est peut-être pas le moyen le plus efficace ... mais c'est vraiment facile)
la source
la source
return float_part ? int_part+'.'+float_part : int_part;
sinon , si vous avez passé entier, il est revenu avec un nombre de points à la fin (entrée exemple:2100
, sortie:2100.
)Peut-être voudrez-vous également un séparateur décimal? Voici une fonction que je viens de faire:
la source
Il n'y a aucun moyen d'éviter l'arrondissement incohérent des prix avec x.xx5 comme valeur réelle en utilisant soit la multiplication soit la division. Si vous devez calculer les prix corrects côté client, vous devez conserver tous les montants en cents. Cela est dû à la nature de la représentation interne des valeurs numériques en JavaScript. Notez qu'Excel souffre des mêmes problèmes afin que la plupart des gens ne remarquent pas les petites erreurs causées par ce phénomène. Cependant, des erreurs peuvent s'accumuler chaque fois que vous additionnez un grand nombre de valeurs calculées, il existe toute une théorie à ce sujet impliquant l'ordre des calculs et d'autres méthodes pour minimiser l'erreur dans le résultat final. Pour souligner les problèmes avec les valeurs décimales, veuillez noter que 0,1 + 0,2 n'est pas exactement égal à 0,3 en JavaScript, tandis que 1 + 2 est égal à 3.
la source
la source
J'utilise ce code pour formater les flottants. Il est basé sur
toPrecision()
mais il supprime les zéros inutiles. Je serais heureux de recevoir des suggestions sur la façon de simplifier l'expression rationnelle.Exemple d'utilisation:
la source