JavaScript math, arrondi à la deuxième décimale [dupliquer]

cette question a déjà une réponse ici:

j'ai la syntaxe JavaScript suivante:

var discount = Math.round(100 - (price / listprice) * 100);

Ce arrondit au nombre entier, comment puis-je retourner le résultat avec deux décimales?

318
demandé sur jgillich 2013-04-02 15:18:30

13 réponses

NOTE - Voir Modifier 4 si la précision à 3 chiffres est importante

var discount = (price / listprice).toFixed(2);

toFixed arrondira vers le haut ou vers le bas pour vous en fonction des valeurs au-delà de 2 décimales.

exemple: http://jsfiddle.net/calder12/tv9HY /

Documentation: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed

Edit - comme mentionné par d'autres cela convertit le résultat en une chaîne. Pour éviter cela:

var discount = +((price / listprice).toFixed(2));

Edit 2 - comme également mentionné dans les commentaires cette fonction échoue avec une certaine précision, dans le cas de 1.005 par exemple, il retournera 1.00 au lieu de 1.01. Si l'exactitude à ce degré est important j'ai trouvé cette réponse: https://stackoverflow.com/a/32605063/1726511 qui semble fonctionner bien avec tous les tests que j'ai essayé.

il y a une modification mineure nécessaire cependant, la fonction dans la réponse liée ci-dessus renvoie des nombres entiers quand elle tourne à un, Ainsi par exemple 99.004 retournera 99 au lieu de 99.00 ce qui n'est pas idéal pour afficher les prix.

Edit 3 - semble avoir le tofixé sur le retour réel était encore en train de foirer quelques chiffres, cette édition finale semble fonctionner. - Ok, donc beaucoup de retouches!

   var discount = roundTo((price / listprice), 2);

   function roundTo(n, digits) {
     if (digits === undefined) {
       digits = 0;
     }

     var multiplicator = Math.pow(10, digits);
     n = parseFloat((n * multiplicator).toFixed(11));
     var test =(Math.round(n) / multiplicator);
     return +(test.toFixed(digits));
   }

voir Exemple de violon ici: https://jsfiddle.net/calder12/3Lbhfy5s /

Edit 4 - vous me tuez. Edit 3 échoue sur les nombres négatifs, sans chercher à savoir pourquoi il est juste plus facile de gérer le fait de rendre un nombre négatif positif avant de faire l'arrondissement, puis de le retourner avant de retourner le résultat.

function roundTo(n, digits) {
    var negative = false;
    if (digits === undefined) {
        digits = 0;
    }
        if( n < 0) {
        negative = true;
      n = n * -1;
    }
    var multiplicator = Math.pow(10, digits);
    n = parseFloat((n * multiplicator).toFixed(11));
    n = (Math.round(n) / multiplicator).toFixed(2);
    if( negative ) {    
        n = (n * -1).toFixed(2);
    }
    return n;
}

violon: https://jsfiddle.net/3Lbhfy5s/79 /

607
répondu Rick Calder 2017-10-20 18:02:13

si vous utilisez un unary plus pour convertir une chaîne en un nombre comme documenté sur MDN .

par exemple: +discount.toFixed(2)

117
répondu John Gietzen 2016-09-25 07:04:29

Les fonctions Mathématiques.round() et .toFixed () est censé arrondir à l'entier le plus proche. Vous obtiendrez des résultats incorrects en traitant des décimales et en utilisant la méthode "multiplier et diviser" pour les maths.round () ou paramètre pour .toFixed (). Par exemple, si vous essayez d'arrondir 1.005 en utilisant les mathématiques.round(1.005 * 100) / 100 alors vous obtiendrez le résultat de 1, et à l'aide de 1.00 .toFixed (2) au lieu d'obtenir la bonne réponse de 1.01.

vous pouvez utiliser ce qui suit pour résoudre ce problème:

Number(Math.round(100 - (price / listprice) * 100 + 'e2') + 'e-2');

Add .toFixed(2) pour obtenir les deux décimales que vous vouliez.

Number(Math.round(100 - (price / listprice) * 100 + 'e2') + 'e-2').toFixed(2);

vous pourriez faire une fonction qui gérera l'arrondissement pour vous:

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

exemple: https://jsfiddle.net/k5tpq3pd/36 /

Alternativ

vous pouvez ajouter une fonction ronde au nombre en utilisant prototype. Je ne suggérerais pas d'ajouter .toFixed () ici car il retournerait une chaîne au lieu d'un nombre.

Number.prototype.round = function(decimals) {
    return Number((Math.round(this + "e" + decimals)  + "e-" + decimals));
}

et l'utiliser comme ceci:

var numberToRound = 100 - (price / listprice) * 100;
numberToRound.round(2);
numberToRound.round(2).toFixed(2); //Converts it to string with two decimals

exemple https://jsfiddle.net/k5tpq3pd/35 /

Source: http://www.jacklmoore.com/notes/rounding-in-javascript /

36
répondu Arne H. Bitubekk 2018-04-18 12:14:51

pour obtenir le résultat avec deux décimales, vous pouvez faire comme ceci:

var discount = Math.round((100 - (price / listprice) * 100) * 100) / 100;

à arrondir La valeur est multipliée par 100 pour garder les deux premiers chiffres, puis on divise par 100 pour obtenir le résultat réel.

28
répondu Cattode 2013-04-02 11:33:19

essayez d'utiliser discount.toFixed(2);

13
répondu Harish 2014-01-06 01:18:00

la meilleure solution simple que j'ai trouvée est

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

round(1.005, 2); // 1.01

référence: http://www.jacklmoore.com/notes/rounding-in-javascript /

8
répondu Naga Srinu Kapusetti 2017-02-21 13:22:01

je pense que le meilleur moyen que j'ai vu fait est de multiplier par 10 la puissance du nombre de chiffres, puis de faire un calcul.rond, puis se divisant finalement par 10 à la puissance des chiffres. Voici une fonction simple que j'utilise en dactylographie:

function roundToXDigits(value: number, digits: number) {
    value = value * Math.pow(10, digits);
    value = Math.round(value);
    value = value / Math.pow(10, digits);
    return value;
}

Ou de la plaine javascript:

function roundToXDigits(value, digits) {
    if(!digits){
        digits = 2;
    }
    value = value * Math.pow(10, digits);
    value = Math.round(value);
    value = value / Math.pow(10, digits);
    return value;
}
8
répondu Bryce 2017-04-21 02:14:39

une petite variation par rapport à la réponse acceptée. toFixed(2) renvoie une chaîne de caractères, et vous obtiendrez toujours deux décimales. Ceux-ci pourraient être des zéros. Si vous souhaitez supprimer zéro final(s), il suffit de faire ceci:

var discount = + ((price / listprice).toFixed(2));

édité: Je viens de découvrir ce qui semble être un bug dans Firefox 35.0.1, ce qui signifie que ce qui précède peut donner NaN avec quelques valeurs.

J'ai changé mon code en

var discount = Math.round(price / listprice * 100) / 100;

cela donne un nombre avec jusqu'à deux décimales. Si vous vouliez trois, vous devez multiplier et diviser par 1000, et ainsi de suite.

L'OP veut toujours deux décimales, mais si toFixed () est cassé dans Firefox il doit être réparé en premier.

Voir https://bugzilla.mozilla.org/show_bug.cgi?id=1134388

7
répondu HalfTitle 2015-02-18 22:46:13

voie la plus rapide - plus rapide que toFixed ():

DEUX DÉCIMALES

x      = .123456
result = Math.round(x * 100) / 100  // result .12

TROIS DÉCIMALES

x      = .123456
result = Math.round(x * 1000) / 1000      // result .123
5
répondu Kamy D 2016-02-13 00:59:10
    function round(num,dec)
    {
      num = Math.round(num+'e'+dec)
      return Number(num+'e-'+dec)
    }
      //Round to a decimal of your choosing:
    round(1.3453,2)
2
répondu Chris Martin 2017-03-25 04:56:48

pour traiter l'arrondissement à n'importe quel nombre de décimales, une fonction avec 2 lignes de code suffira pour la plupart des besoins. Voici un exemple de code à utiliser.



    var testNum = 134.9567654;
    var decPl = 2;
    var testRes = roundDec(testNum,decPl);  
    alert (testNum + ' rounded to ' + decPl + ' decimal places is ' + testRes);

    function roundDec(nbr,dec_places){
        var mult = Math.pow(10,dec_places);
        return Math.round(nbr * mult) / mult;
    }

0
répondu user3232196 2016-09-05 16:02:01

function discoverOriginalPrice(discountedPrice, salePercentage) {
  var originalPrice = discountedPrice / (1 - (salePercentage * .01));
  return +originalPrice.toFixed(2);
}
0
répondu James Kip 2016-12-02 02:32:51

voici un exemple pratique

var value=200.2365455;
result=Math.round(value*100)/100    //result will be 200.24
-1
répondu Rodgers Kilonzo 2016-06-13 14:33:36