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?
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.)
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...
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".
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
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
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;
}
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);
}
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
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?