Question

En JavaScript, la façon typique de contourner un nombre à n décimales est quelque chose comme:

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

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

console.log(roundNumber(0.1 + 0.2, 2));
console.log(roundNumber(2.1234, 2));

Cependant, cette approche s'arrête à un maximum de n décimaux pendant que je veux toujours Rond à n décimales. Par exemple, "2.0" serait arrondi à "2".

Des idées?

Était-ce utile?

La solution

Ce n'est pas une plaque d'arrondi, c'est un problème d'affichage. Un nombre ne contient pas d'informations sur des chiffres importants; La valeur 2 est la même que 2.0000000000000. C'est lorsque vous transformez la valeur arrondie en une chaîne que vous avez fait afficher un certain nombre de chiffres.

Vous pouvez simplement ajouter des zéros après le numéro, 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 utilisent la période comme séparateur décimal, le code a besoin de plus de travail pour fonctionner pour d'autres paramètres.)

Autres conseils

Je pense qu'il y a une approche plus simple de toutes les données ici, et c'est la méthode Number.toFixed() déjà implémenté dans JavaScript.

Écrivez simplement:

var myNumber = 2;

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

etc...

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

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 personnage à l'aide d'un constructeur de tableau ici Si vous êtes curieux de savoir pourquoi j'ai ajouté le "+ 1".

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

var number = 51.93999999999761;

Je voudrais obtenir une précision à quatre chiffres: 51,94

Faites juste:

number.toPrecision(4);

Le résultat sera: 51,94

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. Contrairement à l'arrondi décimal dans l'exemple ci-dessus, cela ne fait aucune conversion vers et à partir des chaînes, et le paramètre de précision fonctionne de la même manière que PHP et Excel par lequel un positif 1 allait à 1 décimal et -1 serait à la fin des dizaines.

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

de Référence du développeur de Mozilla pour math.round ()

Espérons que le code de travail (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;
}

Cela fonctionne pour l'arrondi à N chiffres (si vous voulez simplement tronquer à N chiffres, supprimez l'appel Math.Round et utilisez le math.trunc un):

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

J'ai dû recourir à une telle logique à Java dans le passé quand je créais Composants de la manipulation des données. C'est-à-dire que j'ai découvert que l'ajout de 0,1 plusieurs fois à 0, vous vous retrouveriez avec une partie décimale inattendue (cela est dû à l'arithmétique à virgule flottante).

Un commentaire d'utilisateur à Numéro de format pour toujours montrer 2 décimales Appelle cette mise à l'échelle de la technique.

Certains mentionnent qu'il y a des cas qui n'arrondissent 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);
}

Voici un lien vers un sprintf javascript,

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

Un appel à sprintf () est une méthodologie d'arrondi dans Perl, mais JavaScript n'a pas cette fonction nativement.

http://perldoc.perl.org/fonctions/sprintf.html

Est ce que ça aide?

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); reviendra 600.23

Si vous ne vous souciez pas vraiment de l'arrondissement, il suffit d'ajouter un tofixé (x), puis de supprimer les 0E de traîne et le point si nécessaire. Ce n'est pas une solution rapide.

function format(value, decimals) {
    if (value) {
        value = value.toFixed(decimals);            
    } else {
        value = "0";
    }
    if (value.indexOf(".") < 0) { value += "."; }
    var dotIdx = value.indexOf(".");
    while (value.length - dotIdx <= decimals) { value += "0"; } // add 0's

    return value;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top