La réponse de Dogbert est bonne, mais si votre code doit gérer des nombres négatifs, il Math.floor
peut à lui seul donner des résultats inattendus.
Par exemple Math.floor(4.3) = 4
, maisMath.floor(-4.3) = -5
Utilisez plutôt une fonction d'aide comme celle-ci pour obtenir des résultats cohérents:
truncateDecimals = function (number) {
return Math[number < 0 ? 'ceil' : 'floor'](number);
};
var a = 5.467;
var truncated = truncateDecimals(a * 100) / 100;
Voici une version plus pratique 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;
};
var a = 5.467;
var truncated = truncateDecimals(a, 2);
var b = 4235.24;
var truncated = truncateDecimals(b, -2);
Si ce n'est pas le comportement souhaité, insérez un appel à Math.abs
sur la première ligne:
var multiplier = Math.pow(10, Math.abs(digits)),
EDIT: shendz souligne correctement que l'utilisation de cette solution avec a = 17.56
produira incorrectement 17.55
. Pour en savoir plus sur les raisons de cette situation, lisez Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante . Malheureusement, écrire une solution qui élimine toutes les sources d'erreur en virgule flottante est assez délicat avec javascript. Dans une autre langue, vous utiliseriez des entiers ou peut-être un type décimal, mais avec javascript ...
Cette solution doit être précise à 100%, mais elle 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 qui veulent également éviter les erreurs en virgule flottante, essayez quelque chose comme BigDecimal.js . Vous pouvez trouver d'autres bibliothèques javascript BigDecimal dans cette question SO: "Existe-t-il une bonne bibliothèque Javascript BigDecimal?" et voici un bon article de blog sur les bibliothèques mathématiques pour Javascript