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?
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;
}
si vous utilisez un unary plus pour convertir une chaîne en un nombre comme documenté sur MDN .
par exemple: +discount.toFixed(2)
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 /
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.
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 /
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;
}
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
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
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)
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;
}
function discoverOriginalPrice(discountedPrice, salePercentage) {
var originalPrice = discountedPrice / (1 - (salePercentage * .01));
return +originalPrice.toFixed(2);
}
voici un exemple pratique
var value=200.2365455;
result=Math.round(value*100)/100 //result will be 200.24