web-dev-qa-db-fra.com

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 veux toujours arrondir à N décimales Par exemple, "2.0" serait arrondi à "2". 

Des idées?

88
hoju

Ce n'est pas un problème d'arrondi, c'est un problème d'affichage. Un nombre ne contient pas d'informations sur les chiffres significatifs; la valeur 2 est identique à 2.0000000000000. C'est lorsque vous convertissez la valeur arrondie en une chaîne que vous devez lui faire afficher un certain nombre de chiffres.

Vous pouvez simplement ajouter des zéros après le nombre, par exemple:

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 utilisent un point comme séparateur décimal, le code nécessite encore plus de travail pour fonctionner avec d'autres paramètres.)

20
Guffa

Je pense qu'il y a une approche plus simple à tous donnée ici, et c'est 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...

215
David

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

function toFixed(value, precision) {
    var precision = precision || 0,
        power = Math.pow(10, precision),
        absValue = Math.abs(Math.round(value * power)),
        result = (value < 0 ? '-' : '') + String(Math.floor(absValue / power));

    if (precision > 0) {
        var fraction = String(absValue % power),
            padding = new Array(Math.max(precision - fraction.length, 0) + 1).join('0');
        result += '.' + padding + fraction;
    }
    return result;
}

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

47
Elias Zamaria

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

15
de.la.ru

Méthode d'arrondi de type PHP

Le code ci-dessous peut être utilisé pour ajouter votre propre version de Math.round à votre propre espace de noms qui prend un paramètre de précision. À la différence de l'arrondi décimal dans l'exemple ci-dessus, ceci n'effectue aucune conversion vers et depuis des chaînes, et le paramètre de précision fonctionne de la même manière que PHP et Excel dans lequel un 1 positif arrondira à 1 décimale et -1 aux arrondis .

var myNamespace = {};
myNamespace.round = function(number, precision) {
    var factor = Math.pow(10, precision);
    var tempNumber = number * factor;
    var roundedTempNumber = Math.round(tempNumber);
    return roundedTempNumber / factor;
};

myNamespace.round(1234.5678, 1); // 1234.6
myNamespace.round(1234.5678, -1); // 1230

from Référence de développeur Mozilla pour Math.round ()

5
JohnnyBizzle

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;
}
2
Christoph

Cela fonctionne pour arrondir à N chiffres (si vous voulez seulement tronquer à N chiffres, supprimez l'appel Math.round et utilisez celui de Math.trunc):

function roundN(value, digits) {
   var tenToN = 10 ** digits;
   return /*Math.trunc*/(Math.round(value * tenToN)) / tenToN;
}

Devait avoir recours à une telle logique à Java dans le passé, lorsque je créais composants E-Slate de manipulation de données . C’est depuis que j’ai découvert qu’en ajoutant 0,1 à plusieurs fois à 0, vous vous retrouveriez avec une partie décimale d’une longueur inattendue (ceci est dû à l’arithmétique à virgule flottante).

Un commentaire utilisateur à Le numéro de format pour toujours afficher 2 décimales appelle cette technique à l'échelle.

Certains mentionnent qu'il y a des cas qui ne se rondent pas comme prévu et à http://www.jacklmoore.com/notes/rounding-in-javascript/ ceci est suggéré à la place:

function round(value, decimals) {
  return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}
1
George Birbilis

Je pense que la fonction ci-dessous peut aider 

function roundOff(value,round) {
   return (parseInt(value * (10 ** (round + 1))) - parseInt(value * (10 ** round)) * 10) > 4 ? (((parseFloat(parseInt((value + parseFloat(1 / (10 ** round))) * (10 ** round))))) / (10 ** round)) : (parseFloat(parseInt(value * (10 ** round))) / ( 10 ** round));
}

utilisation: roundOff(600.23458,2); retournera 600.23

0
KRISHNA TEJA

Voici un lien vers un sprintf Javascript, 

http://www.webtoolkit.info/javascript-sprintf.html

Un appel à sprintf () est une méthode d'arrondi en Perl, mais Javascript n'a pas cette fonction en mode natif. 

http://perldoc.Perl.org/functions/sprintf.html

Est ce que ça aide?

0
Paul