409 votes

Comment arrondir les nombres flottants en javascript ?

J'ai besoin d'arrondir par exemple 6.688689 a 6.7 mais il me montre toujours 7 .

Ma méthode :

Math.round(6.688689);
//or
Math.round(6.688689, 1);
//or 
Math.round(6.688689, 2);

Mais le résultat est toujours le même 7 ... Qu'est-ce que je fais de travers ?

49 votes

(6.688689).toFixed(1);

0 votes

Vérifiez ce

0 votes

Duplication possible de arrondir un nombre en JavaScript à N décimales -- veuillez utiliser la fonction de recherche avant de poser une nouvelle question.

694voto

davin Points 19682
Number((6.688689).toFixed(1)); // 6.7

35 votes

Convertir un nombre en chaîne de caractères et inversement ? Ça ne peut pas être rapide.

0 votes

Pas bon si votre nombre a moins de décimales que nécessaire. Il ajoute un peu de

3 votes

Comme le montre le benchmark JS, il est plus lent que la méthode @fivedigit

213voto

fivedigit Points 6498
var number = 6.688689;
var roundedNumber = Math.round(number * 10) / 10;

22 votes

Cela ne fonctionne pas toujours. Prenez Math.round(1.005*100)/100 par exemple de MDN

14 votes

@tybro0103 Le mal des points flottants : 1.005 * 100 = 100.49999999999999 (du moins dans le moteur JS que j'ai essayé). C'est pourquoi cela ne fonctionne pas et pourquoi vous ne devriez jamais compter sur des flottants parfaitement précis.

5 votes

Faux. Math.round(1.015 * 100) / 100 renvoie 1.01 au lieu de 1.02.

117voto

black_wizard Points 1374

Utilisez toFixed() fonction.

(6.688689).toFixed(); // equal to "7"
(6.688689).toFixed(1); // equal to "6.7"
(6.688689).toFixed(2); // equal to "6.69"

10 votes

Cela pourrait NE PAS FAIRE ce que vous attendez ! Le résultat peut même dépendre du navigateur, voir cette question : stackoverflow.com/q/566564/2224996

11 votes

(6.688689).toFixed() ; est égal à "7" et non à 7. Idem pour les autres exemples.

1 votes

Cette réponse est trompeuse. Par exemple (1).toFixed(4) renvoie '1.0000'.

37voto

a.s.panchenko Points 375

Mises à jour (2019-10). Merci à Reece Daniels le code ci-dessous est maintenant disponible comme un ensemble de fonctions emballées dans npm-package attendu-round (regardez).


Vous pouvez utiliser la fonction d'aide de Exemple de MDN . Vous aurez alors plus de flexibilité :

Math.round10(5.25, 0);  // 5
Math.round10(5.25, -1); // 5.3
Math.round10(5.25, -2); // 5.25
Math.round10(5, 0);     // 5
Math.round10(5, -1);    // 5
Math.round10(5, -2);    // 5

Mise à jour (2019-01-15). Il semble que la documentation MDN ne dispose plus de cette fonction d'aide. Voici une sauvegarde avec des exemples :

// Closure
(function() {
  /**
   * Decimal adjustment of a number.
   *
   * @param {String}  type  The type of adjustment.
   * @param {Number}  value The number.
   * @param {Integer} exp   The exponent (the 10 logarithm of the adjustment base).
   * @returns {Number} The adjusted value.
   */
  function decimalAdjust(type, value, exp) {
    // If the exp is undefined or zero...
    if (typeof exp === 'undefined' || +exp === 0) {
      return Math[type](value);
    }
    value = +value;
    exp = +exp;
    // If the value is not a number or the exp is not an integer...
    if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {
      return NaN;
    }
    // If the value is negative...
    if (value < 0) {
      return -decimalAdjust(type, -value, exp);
    }
    // Shift
    value = value.toString().split('e');
    value = Math[type](+(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));
  }

  // Decimal round
  if (!Math.round10) {
    Math.round10 = function(value, exp) {
      return decimalAdjust('round', value, exp);
    };
  }
  // Decimal floor
  if (!Math.floor10) {
    Math.floor10 = function(value, exp) {
      return decimalAdjust('floor', value, exp);
    };
  }
  // Decimal ceil
  if (!Math.ceil10) {
    Math.ceil10 = function(value, exp) {
      return decimalAdjust('ceil', value, exp);
    };
  }
})();

Exemples d'utilisation :

// Round
Math.round10(55.55, -1);   // 55.6
Math.round10(55.549, -1);  // 55.5
Math.round10(55, 1);       // 60
Math.round10(54.9, 1);     // 50
Math.round10(-55.55, -1);  // -55.5
Math.round10(-55.551, -1); // -55.6
Math.round10(-55, 1);      // -50
Math.round10(-55.1, 1);    // -60
Math.round10(1.005, -2);   // 1.01 -- compare this with Math.round(1.005*100)/100 above
Math.round10(-1.005, -2);  // -1.01
// Floor
Math.floor10(55.59, -1);   // 55.5
Math.floor10(59, 1);       // 50
Math.floor10(-55.51, -1);  // -55.6
Math.floor10(-51, 1);      // -60
// Ceil
Math.ceil10(55.51, -1);    // 55.6
Math.ceil10(51, 1);        // 60
Math.ceil10(-55.59, -1);   // -55.5
Math.ceil10(-59, 1);       // -50

4 votes

? ? "Math.round10 n'est pas une fonction"

1 votes

J'ai trouvé cela extrêmement utile et je l'ai donc transformé en un paquet npm rapide pour ceux qui cherchent à l'utiliser sans gonfler le code supplémentaire. J'ai crédité @a.s.panchenko de la réponse originale également : npmjs.com/package/expected-round

7voto

Fahim Parkar Points 8662

Voir ci-dessous

var original = 28.59;

var result=Math.round(original*10)/10 vous renverra des retours 28.6

J'espère que c'est ce que vous voulez

14 votes

"Si j'avais une pièce de monnaie pour chaque fois que j'ai vu quelqu'un utiliser FLOAT pour stocker de la monnaie, j'aurais 999,997634 $" -- Bill Karwin.

3 votes

Faux. Math.round(1.015 * 100) / 100

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