Comment puis-je obtenir les décimales d'un nombre à virgule flottante en Javascript?
Ce que j'aimerais avoir, c'est presque à l'opposé de Nombre.le prototype.toPrecision(), ce qui signifie que quand j'ai le nombre, combien de décimales? E. g.
(12.3456).getDecimals() //4
15 - Math.ceil(Math.log(x) / Math.log(10))
possible dup: stackoverflow.com/questions/1458633/...
x = 12.3456; var precision = String(x).replace('.', '').length - x.toFixed().length;
Mais la précision de ce nombre est de 6.
@Theonlygusti points, ce n'est pas "de précision". C'est "l'échelle", ou "décimales". La précision est d'environ un nombre important (1234 = 4 prec, l. 1.234 = 4 prec)
OriginalL'auteur JussiR | 2012-03-04
Vous devez vous connecter pour publier un commentaire.
Pour quiconque de se demander comment faire cela plus rapidement (sans avoir à les convertir à la chaîne), voici une solution:
Edit: une solution plus complète à bord des cas couverts:
Si vous passer NaN, il va aller dans une boucle infinie.
C'est une bonne réponse, mais je vous recommande de vérifier pour les cas limites, comme le NaN ou les Infinités, pour éviter la boucle infinie. Aussi, il peut être préférable si vous retourné
Math.round(Math.log(e) / Math.LN10)
à la place.Juste pour le plaisir, mettez ceci dans un jsperf par rapport à la chaîne de réponse ci-dessus. Il est environ 8 fois plus vite: jsperf.com/getting-numerical-precision/2
Veuillez noter que la version en vigueur provoque encore une boucle sans fin si l'entrée n'est pas valide (par exemple, une chaîne vide).
OriginalL'auteur Mourner
Une solution possible (dépend de l'application):
(1.0 + "").split(".")[1].length;
donne une erreur parce quesplit
retourne un caractère, de sorte que nous ne pouvons pas accéder à la deuxième ([1]
) de l'élément.Quelque chose comme ceci devrait fonctionner: fonction getPrecision(nombre) { var n = nombre.toString().split("."); de retour n.longueur > 1 ? n[1].longueur : 0; }
Cette "accepté" la réponse est incorrecte pour le cas général, comme Piotr mentionnés ci-dessus. Aussi, cette question est une duplicate.
(12.3456 + '.').split('.')[1].length;
fonctionne pour tous les cas dans l'obtention de la décimale comte.OriginalL'auteur Manish
Si par "précision" tu veux dire "décimales", alors que c'est impossible parce que les flotteurs sont binaires. Ils n'ont pas ont décimales, et la plupart des valeurs qui ont un petit nombre de décimales de la récurrence de chiffres binaires, et quand ils sont traduites décimale qui n'est pas nécessairement le rendement de l'origine de nombre décimal.
Tout code qui fonctionne avec le "décimales" d'un flotteur, est susceptible de produire des résultats inattendus sur quelques chiffres.
OriginalL'auteur Michael Borgwardt
Essayez ce qui suit
OriginalL'auteur JaredPar
Il n'y a pas de fonction native pour déterminer le nombre de décimales. Ce que vous pouvez faire est de convertir le numéro de chaîne, puis de compter le décalage off le séparateur de décimales
.
:Mais c'est dans la nature de chars de vous tromper.
1
peut tout aussi bien être représenté par0.00000000989
ou quelque chose. Je ne suis pas sûr de savoir comment bien le ci-dessus effectue réellement dans la vraie vie des applications.OriginalL'auteur rodneyrehm
En se basant sur @blackpla9ue commentaire et compte tenu de nombre de format exponentiel:
OriginalL'auteur Boolean_Type
@Boolean_Type de la méthode de gestion des exposants, mais en évitant les regex:
OriginalL'auteur Sc0ttyD
L'une des approches suivantes de travail?
ou
OriginalL'auteur Enayat Rajabi
Voici quelques exemples, qui utilise une bibliothèque (BigNumber.js), et un autre qui n'utilise pas de bibliothèque. Supposons que vous voulez vérifier qu'un certain nombre d'entrée (
inputNumber
) a un montant de chiffres après la virgule est inférieur ou égal à un montant maximal de décimales (tokenDecimals
).Avec BigNumber.js
Sans BigNumber.js
OriginalL'auteur Luke Schoen