Comment obtenir les nombres après une virgule décimale?
Par exemple, si je l'ai 5.55
, comment puis-je l'obtenir .55
?
python
floating-point
decimal
l --''''''--------- '' '' '' '' '' '
la source
la source
Réponses:
Une approche simple pour vous:
la source
number_dec = str(number-int(number)).split('.')[1]
5.55 % 1
, qui est également une réponse plus généralement utile - on peut utiliser l'approche de division modulo dans plusieurs langues, alors que la réponse ci-dessus est spécifique à Python..55
), ce à quoi vous ne pouvez pas vous attendre en raison du titre des questions!str(5.55 - int(5.55))[1:]
renvoie.5499999999999998
au lieu de celui.55
mentionné dans la question.Gardez à l'esprit que cela ne vous aidera pas avec les problèmes d'arrondi en virgule flottante. Ie, vous pouvez obtenir:
Ou sinon un peu en dehors des 0,55 que vous attendez.
la source
modf
, il peut également visser la précision:math.modf(5.55)
reviendra (0.5499999999999998, 5.0).x%1
était presque deux fois plus rapide que les méthodesx-int(x)
etmodf(x)[0]
(les délais étaient de 980ns, 1,39us et 1,47us en moyenne sur 1000000 exécutions). Ma valeur pourx
était toujours positive, donc je n'avais pas à m'inquiéter à ce sujet.Utilisez modf :
la source
math.modf(2.53) = (0.5299999999999998, 2.0)
réponse attendue est 0,53Qu'en est-il de:
Ou, en utilisant numpy:
la source
En utilisant le
decimal
module de la bibliothèque standard, vous pouvez conserver la précision d'origine et éviter les problèmes d'arrondi en virgule flottante:Comme Kindall notes dans les commentaires, vous devez convertir natif
float
de chaînes à la première.la source
n = 5.55
, n est un flottant, et vous devriez le faireDecimal(str(n)) % 1
pour obtenir la partie fractionnaire. (Ce n'est pas nécessaire si vous avez un entier, mais cela ne fait pas de mal.)10.0/3 % 1
au moins sur mon systèmeDecimal.from_float(1.2)
(qui peut maintenant être écrit commeDecimal(1.2)
), vous aurez des problèmes d'arrondi, que cette réponse essayait d'éviter.Essayez Modulo:
la source
similaire à la réponse acceptée, une approche encore plus simple utilisant des chaînes serait
la source
number = 5.55; "." in number
donneTypeError: argument of type 'float' is not iterable
. Et que feriez-vous sinumber = 1e-5
?float
; Python ne garde aucune connaissance du format dans lequel il a été initialement exprimé. Monnumber = 1e-5
exemple s'applique également ànumber = 0.00001
: lastr
représentation du nombre est en notation scientifique. Vous aurez envie de traitere+
aussi bien quee-
, en passant.la source
la source
C'est une solution que j'ai essayée:
la source
Parfois, les zéros de fin comptent
la source
En utilisant simplement la division d' opérateur «/» et la division de plancher «//», vous pouvez facilement obtenir la partie fraction d'un flottant donné.
la source
Utilisez le plancher et soustrayez le résultat du nombre d'origine:
la source
import math
, pourquoi ne pas simplement utilisermath.modf()
?math.floor(-1.1) == -2
maisint(-1.1) == -1
. Bien que pour cette question, l'utilisationint
est plus correcte.Les nombres flottants ne sont pas stockés au format décimal (base10). Lisez la documentation python à ce sujet pour vous convaincre pourquoi. Par conséquent, obtenir une représentation base10 à partir d'un flottant n'est pas conseillé.
Il existe maintenant des outils qui permettent de stocker des données numériques au format décimal. Voici un exemple d'utilisation de la
Decimal
bibliothèque.la source
Exemple:
Cela vous donnera deux nombres après la virgule décimale, 55 de cet exemple. Si vous avez besoin d'un nombre, vous réduisez de 10 les calculs ci-dessus ou augmentez en fonction du nombre de nombres que vous voulez après la virgule.
la source
Cela a vraiment fonctionné
la source
Qu'en est-il de:
Production:
print(b)
0.23399999999999999
round(b, length-2)
0.234
Puisque l'arrondi est envoyé à la longueur de la chaîne de décimales ('0,234'), nous pouvons simplement moins 2 pour ne pas compter le '0.', et déterminer le nombre souhaité de décimales. Cela devrait fonctionner la plupart du temps, à moins que vous n'ayez beaucoup de décimales et que l'erreur d'arrondi lors du calcul de b interfère avec le deuxième paramètre d'arrondi.
la source
Vous pouvez essayer ceci:
Il reviendra
0.55
.la source
sortie: 0,55
la source
Voyez ce que je fais souvent pour obtenir des nombres après la virgule décimale en python 3:
la source
Si vous utilisez des pandas:
la source
Une autre option serait d'utiliser le
re
module avecre.findall
oure.search
:Production
Si vous souhaitez simplifier / modifier / explorer l'expression, cela a été expliqué dans le panneau supérieur droit de regex101.com . Si vous le souhaitez, vous pouvez également regarder dans ce lien , comment il correspondrait à certains exemples d'entrées.
La source
Comment se débarrasser des nombres flottants supplémentaires dans la soustraction python?
la source
J'ai trouvé que de très grands nombres avec de très grandes parties fractionnaires peuvent poser des problèmes lors de l'utilisation de modulo 1 pour obtenir la fraction.
J'ai plutôt saisi la partie intégrale et l'ai soustraite d'abord pour aider à simplifier le reste.
la source
Un autre exemple utilisant modf
la source
Une solution utilise modulo et arrondi.
Votre sortie sera de 0,55
la source
Vous pouvez utiliser ceci:
la source
Une autre solution folle est (sans conversion en chaîne):
la source