639 votes

JavaScript: numéro de formatage avec exactement deux décimales

J'ai cette ligne de code qui arrondit mes nombres à 2 décimales. Mais le truc c'est que j'ai des chiffres comme ça. 10.8, 2.4 etc. Ce ne sont pas mon idée de 2 décimales alors comment je peux améliorer ceci:

 Math.round(price*Math.pow(10,2))/Math.pow(10,2);
 

Je veux des chiffres comme 10.80, 2.40, etc. L'utilisation de JQuery me convient parfaitement.

1138voto

CMS Points 315406

Pour formater un nombre en utilisant la notation à virgule fixe, vous pouvez simplement utiliser la méthode toFixed :

 (10.8).toFixed(2); // 10.80

var num = 2.4;
alert(num.toFixed(2)); // 2.40
 

111voto

Jérémie Astori Points 595

C'est un vieux sujet, mais toujours en tête du classement des résultats de Google et les solutions proposées, de partager le même point flottant décimales question. Voici la (très générique) fonction que j'utilise, grâce à MDN:

function round(value, exp) {
  if (typeof exp === 'undefined' || +exp === 0)
    return Math.round(value);

  value = +value;
  exp  = +exp;

  if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0))
    return NaN;

  // Shift
  value = value.toString().split('e');
  value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)));

  // Shift back
  value = value.toString().split('e');
  return +(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp));
}

Comme nous pouvons le voir, nous n'avons pas ces problèmes:

round(1.275, 2);   // Returns 1.28
round(1.27499, 2); // Returns 1.27

Cette genericity fournit également des trucs cool:

round(1234.5678, -2);   // Returns 1200
round(1.2345678e+2, 2); // Returns 123.46
round("123.45");        // Returns 123

Maintenant, pour répondre à l'OP de la question, il est de type:

round(10.8034, 2).toFixed(2); // Returns "10.80"
round(10.8, 2).toFixed(2);    // Returns "10.80"

Ou, pour un plus concis, moins de la fonction générique:

function round2Fixed(value) {
  value = +value;

  if (isNaN(value))
    return NaN;

  // Shift
  value = value.toString().split('e');
  value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + 2) : 2)));

  // Shift back
  value = value.toString().split('e');
  return (+(value[0] + 'e' + (value[1] ? (+value[1] - 2) : -2))).toFixed(2);
}

Vous pouvez appeler avec:

round2Fixed(10.8034); // Returns "10.80"
round2Fixed(10.8);    // Returns "10.80"

45voto

Miguel Points 406

J'ajoute généralement ceci à ma bibliothèque personnelle, et après quelques suggestions et en utilisant la solution @TIMINeutron aussi, et la rendant adaptable pour la longueur décimale alors, celui-ci correspond le mieux:

  function precise_round(num, decimals) {
var t=Math.pow(10, decimals);   
 return (Math.round((num * t) + (decimals>0?1:0)*(Math.sign(num) * (10 / Math.pow(100, decimals)))) / t).toFixed(decimals);
    }
 

fonctionnera pour les exceptions signalées.

18voto

TIMINeutron Points 135

Je ne sais pas pourquoi je ne peux pas ajouter un commentaire à une précédente réponse (peut-être que je suis désespérément à l'aveugle, je ne sais pas), mais j'ai trouvé une solution en utilisant @Miguel de réponse:

function precise_round(num,decimals){
return Math.round(num*Math.pow(10,decimals))/Math.pow(10,decimals);
}

Et ses deux commentaires (à partir de @bighostkim et @Imre):

  • Problème avec precise_round(1.275,2) pas de retour 1.28
  • Problème avec precise_round(6,2) non retour d'au moins 6,00 (comme il le voulait).

Ma solution finale est comme suit:

function precise_round(num,decimals){
    var sign = num >= 0 ? 1 : -1;
    return (Math.round((num*Math.pow(10,decimals))+(sign*0.001))/Math.pow(10,decimals)).toFixed(decimals);
}

Comme vous pouvez le voir j'ai dû ajouter un peu de "correction" (ce n'est pas ce qu'il est, mais depuis les Mathématiques.tour entraîne une perte - vous pouvez le vérifier sur jsfiddle.net - c'est la seule façon que je savais comment "réparer"). Il ajoute 0,001 à la déjà collier de nombre, il est l'ajout d'un 1 trois 0s à la droite de la valeur décimale. Donc il devrait être sûr d'utiliser.

Après que j'ai ajouté .toFixed(decimal) toujours de sortie, le nombre dans le format correct (avec la bonne quantité de décimales).

Donc, c'est assez bien. Il faut bien l'utiliser ;)

EDIT: ajout de la fonctionnalité de la "correction" des nombres négatifs.

14voto

Syed Umar Ahmed Points 1364
<blockquote> <p>toFixed(n) fournit la longueur n après la virgule ; toPrecision(x) fournit x longueur totale.</p> <p>Utilisez cette méthode ci-dessous</p><pre><code></code></pre><p>ET si vous voulez le nombre fixé utiliser</p><pre><code></code></pre></blockquote>

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