web-dev-qa-db-fra.com

Méthode la plus simple pour obtenir le nombre de décimales d'un nombre en JavaScript

Existe-t-il une meilleure façon de déterminer le nombre de décimales sur un nombre que dans mon exemple?

var nbr = 37.435.45;
var decimals = (nbr!=Math.floor(nbr))?(nbr.toString()).split('.')[1].length:0;

Par mieux, je veux dire plus rapide pour exécuter et/ou utiliser une fonction JavaScript native, c'est-à-dire. quelque chose comme nbr.getDecimals ().

Merci d'avance!

MODIFIER:

Après avoir modifié la réponse series0ne, le moyen le plus rapide que j'ai pu gérer est:

var val = 37.435345;
var countDecimals = function(value) {
    if (Math.floor(value) !== value)
        return value.toString().split(".")[1].length || 0;
    return 0;
}
countDecimals(val);

Test de vitesse: http://jsperf.com/checkdecimals

27
PhilTrep
Number.prototype.countDecimals = function () {
    if(Math.floor(this.valueOf()) === this.valueOf()) return 0;
    return this.toString().split(".")[1].length || 0; 
}

Lorsqu'il est lié au prototype, cela vous permet d'obtenir le nombre décimal (countDecimals();) directement à partir d'une variable numérique.

PAR EXEMPLE.

var x = 23.453453453;
x.countDecimals(); // 9

Cela fonctionne en convertissant le nombre en une chaîne, en le séparant à . et en renvoyant la dernière partie du tableau, ou 0 si la dernière partie du tableau n'est pas définie (ce qui se produira s'il n'y avait pas de décimale). point).

Si vous ne voulez pas le lier au prototype, vous pouvez simplement utiliser ceci:

var countDecimals = function (value) {
    if(Math.floor(value) === value) return 0;
    return value.toString().split(".")[1].length || 0; 
}
63
series0ne

Ajout à la réponse series0ne si vous voulez que le code ne génère pas d'erreur pour un nombre entier et obtienne un résultat de 0 lorsqu'il n'y a pas de décimales, utilisez ceci:

var countDecimals = function (value) { 
    if ((value % 1) != 0) 
        return value.toString().split(".")[1].length;  
    return 0;
};
22
Pete D

Les regex sont très très peu efficaces dans les calculs, ils sont méchants si vous pouvez aller dans un autre sens. Je les éviterais donc :)

Des choses comme "Number% 1" renvoient la valeur décimale arrondie (2,3% 1 = 0,2999999999999998), et d'une manière générale, je vous conseille d'utiliser des chaînes le plus tôt possible, car les approximations avec des nombres réels peuvent changer le nombre de décimales.

Donc le vôtre va bien, mais je vais chercher un moyen de l'optimiser.

Modifier:

function CountDecimalDigits(number)
{
  var char_array = number.toString().split(""); // split every single char
  var not_decimal = char_array.lastIndexOf(".");
  return (not_decimal<0)?0:char_array.length - not_decimal;
}
1
Ricola3D