Dogbert la réponse est bonne, mais si votre code peut avoir à traiter avec des nombres négatifs, Math.floor
par lui-même peut donner des résultats inattendus.
E. g. Math.floor(4.3) = 4
, mais Math.floor(-4.3) = -5
Utiliser une fonction d'assistance comme celui-ci, au lieu d'obtenir des résultats cohérents:
truncateDecimals = function (number) {
return Math[number < 0 ? 'ceil' : 'floor'](number);
};
// Applied to Dogbert's answer:
var a = 5.467;
var truncated = truncateDecimals(a * 100) / 100; // = 5.46
Voici un moyen plus pratique version de cette fonction:
truncateDecimals = function (number, digits) {
var multiplier = Math.pow(10, digits),
adjustedNum = number * multiplier,
truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);
return truncatedNum / multiplier;
};
// Usage:
var a = 5.467;
var truncated = truncateDecimals(a, 2); // = 5.46
// Negative digits:
var b = 4235.24;
var truncated = truncateDecimals(b, -2); // = 4200
Si ce n'est pas le comportement souhaité, insérer un appel à Math.abs
sur la première ligne:
var multiplier = Math.pow(10, Math.abs(digits)),
EDIT: shendz souligne à juste titre que l'utilisation de cette solution avec a = 17.56
, à tort, produisent 17.55
. Pour en savoir plus sur le pourquoi de ce phénomène, lire Ce que Chaque Ordinateur Scientifique Doit Savoir à Propos de l'Arithmétique à virgule Flottante. Malheureusement, l'écriture d'une solution qui élimine toutes les sources de virgule flottante d'erreur est assez délicat avec javascript. Dans une autre langue que vous souhaitez utiliser des entiers, ou peut-être un type Décimal, mais avec javascript...
Cette solution doit être précis à 100%, mais il sera également plus lente:
function truncateDecimals (num, digits) {
var numS = num.toString(),
decPos = numS.indexOf('.'),
substrLength = decPos == -1 ? numS.length : 1 + decPos + digits,
trimmedResult = numS.substr(0, substrLength),
finalResult = isNaN(trimmedResult) ? 0 : trimmedResult;
return parseFloat(finalResult);
}
Pour ceux qui ont besoin de vitesse, mais aussi d'éviter les erreurs en virgule flottante, essayez quelque chose comme BigDecimal.js. Vous pouvez trouver d'autres javascript BigDecimal des bibliothèques DONC, la question: "Est-il une bonne Javascript BigDecimal bibliothèque?" et voici un bon billet de blog à propos des bibliothèques mathématiques pour Javascript