114 votes

Javascript: formater un nombre arrondi à N décimales

En JavaScript, la méthode classique pour arrondir un nombre à N décimales est la suivante:

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

Cependant, cette approche arrondira à un maximum de N décimales, alors que je souhaite toujours arrondir à N décimales. Par exemple, "2.0" serait arrondi à "2".

Des idées?

259voto

David Points 1029

Je pense qu'il y a une approche plus simple à tous donnée ici, et la méthode Number.toFixed() déjà implémentée en JavaScript.

écrivez simplement:

 var myNumber = 2;

myNumber.toFixed(2); //returns 2.00
myNumber.toFixed(1); //returns 2.0
 

etc...

52voto

Elias Zamaria Points 13196

J'ai trouvé un moyen. C'est le code de Christoph avec un correctif:

 function toFixed(value, precision) {
    var precision = precision || 0,
    neg = value < 0,
    power = Math.pow(10, precision),
    value = Math.round(value * power),
    integral = String((neg ? Math.ceil : Math.floor)(value / power)),
    fraction = String((neg ? -value : value) % power),
    padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');

    return precision ? integral + '.' +  padding + fraction : integral;
}
 

Lisez les détails de la répétition d'un caractère à l'aide d'un constructeur de tableau ici si vous êtes curieux de savoir pourquoi j'ai ajouté le "+ 1".

26voto

Guffa Points 308133

Ce n'est pas un arrondissement ploblem, c'est un problème d'affichage. Un certain nombre ne contient pas d'informations sur les chiffres significatifs; la valeur 2 est le même que 2.0000000000000. C'est lorsque vous mettez l'arrondi de la valeur dans une chaîne de caractères que vous avez faire afficher un certain nombre de chiffres.

Vous pouvez simplement ajouter des zéros après le nombre, quelque chose comme:

var s = number.toString();
if (s.indexOf('.') == -1) s += '.';
while (s.length < s.indexOf('.') + 4) s += '0';

(Notez que cela suppose que les paramètres régionaux du client période d'utilisations comme séparateur décimal, le code doit travailler un peu plus pour fonction d'autres paramètres.)

18voto

Kirill Points 118

Il y a toujours une meilleure façon de faire les choses.

 var number = 51.93999999999761;
 

J'aimerais avoir une précision de quatre chiffres: 51.94

il suffit de faire:

 number.toPrecision(4);
 

le résultat sera: 51.94

2voto

Christoph Points 64389

J'espère que le code fonctionne (n'a pas fait beaucoup de tests):

 function toFixed(value, precision) {
    var precision = precision || 0,
        neg = value < 0,
        power = Math.pow(10, precision),
        value = Math.round(value * power),
        integral = String((neg ? Math.ceil : Math.floor)(value / power)),
        fraction = String((neg ? -value : value) % power),
        padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');

    return precision ? integral + '.' +  padding + fraction : integral;
}
 

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