590 votes

Comment arrondir à une décimale en Javascript ?

Peut-on arrondir un nombre en javascript à 1 caractère après la virgule (correctement arrondi) ?

J'ai essayé le *10, l'arrondi, le /10 mais cela laisse deux décimales à la fin de l'int.

17 votes

Math.round(n * 10) / 10 fonctionne. Quel est votre code ?

0 votes

1070voto

Billy Moon Points 21439

Math.round( num * 10) / 10 fonctionne, voici un exemple...

var number = 12.3456789;
var rounded = Math.round( number * 10 ) / 10;
// rounded is 12.3

si vous voulez qu'il y ait une décimale, même si c'est un 0, alors ajoutez...

var fixed = rounded.toFixed(1);
// fixed is always to 1dp
// BUT: returns string!

// to get it back to number format
parseFloat( number.toFixed(2) )
// 12.34
// but that will not retain any trailing zeros

// so, just make sure it is the last step before output,
// and use a number format during calculations!

66 votes

Faites attention en utilisant .toFixed() car il renvoie une chaîne de caractères alors que vous voulez peut-être un nombre.

1 votes

Cool, évidemment en utilisant parseFloat supprimera les décimales laissées par .toFixed() si c'est un nombre entier (zéros). En général, si vous voulez faire des calculs, il est préférable de suivre le premier exemple. Si vous souhaitez afficher un nombre dans votre interface utilisateur, utilisez la commande .toFixed() .

0 votes

Hmmm... c'est logique, n'importe quelle façon de convertir en nombre doit toujours enlever les zéros erronés, c'est pourquoi cela doit rester une chaîne. Je suppose que cela devrait toujours être la dernière étape avant l'affichage, et ne pas être utilisé dans les calculs.

158voto

Pablo Fernandez Points 32003
var number = 123.456;

console.log(number.toFixed(1)); // should round to 123.5

6 votes

Parfois toFixed() a des pépins - je l'ai vu dans un navigateur Chrome où j'appelle toFixed() puis convertir en une chaîne de caractères, et il montre quelque chose comme 10.00000000068 - bizarre. Mais je ne peux pas le reproduire de manière fiable.

0 votes

Oui, j'ai rencontré des problèmes avec toFixed() même avec quelques décimales. Il arrondissait la fraction 4 à la valeur supérieure au lieu de la valeur inférieure, si je me souviens bien.

2 votes

Comme mentionné par @cobby ci-dessus : soyez prudent en utilisant .toFixed() car il renvoie un String quand vous voulez peut-être un Number

54voto

Jasper de Vries Points 3043

Si vous utilisez Math.round alors vous reviendrez 5 en cas de 5.01 et non 5.0 .

Si vous utilisez toFixed vous rencontrez arrondir questions .

Si vous voulez le meilleur des deux mondes, combinez les deux :

(Math.round(5.01 * 10) / 10).toFixed(1)

Vous pourriez vouloir créer une fonction pour cela :

function roundedToFixed(_float, _digits){
  var rounder = Math.pow(10, _digits);
  return (Math.round(_float * rounder) / rounder).toFixed(_digits);
}

12voto

jimbojw Points 5361

Je vote pour toFixed() mais, pour mémoire, voici une autre méthode qui utilise le décalage de bits pour convertir le nombre en un int. Ainsi, il arrondit toujours vers zéro (vers le bas pour les nombres positifs, vers le haut pour les négatifs).

var rounded = ((num * 10) << 0) * 0.1;

Mais bon, comme il n'y a pas d'appels de fonction, c'est super rapide :)

Et en voici un qui utilise la correspondance des chaînes de caractères :

var rounded = (num + '').replace(/(^.*?\d+)(\.\d)?.*/, '$1$2');

Je ne recommande pas l'utilisation de la variante string, je dis ça comme ça.

4voto

Murplyx Points 455

x = nombre, n = décimales :

function round(x, n) {
    return Math.round(x * Math.pow(10, n)) / Math.pow(10, n)
}

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