1
votes

Formatage d'un nombre flottant sans zéros de fin

Quand je fais une division simple en Python 3, comme 123000/1000, j'obtiens 123.0, ou 4/2 j'obtiens 2.0. Comment puis-je me débarrasser du zéro final dans la division de Python 3?

MODIFIER: Je ne veux pas simplement une simple division entière. Par exemple, 1234/1000 devrait donner 1,234. Pour être clair, cette question concerne le formatage de la sortie, pas la représentation interne.


6 commentaires

Ensuite, vous voulez un entier. Faire une division entière 123000 // 1000


Possibilité de duplication de La division d'entiers Python donne un flottant


Pourquoi avez-vous besoin de vous débarrasser du zéro final? Est-ce pour l'afficher ou y a-t-il une raison interne pour laquelle vous devez vous débarrasser du 0 final? Peut-être que nous pourrions aider avec ce problème à la place


Oui, l'afficher sous forme de chaîne. Je veux ne pas afficher le 0 final lors de l'impression de la valeur sous forme de chaîne, mais afficher la partie décimale si ce n'est pas seulement un .0.


@ItM: Je vous suggère de mettre à jour la question pour refléter qu'il s'agit de formatage de la sortie, pas de représentation interne, car je pense que beaucoup l'interpréteront de manière erronée pour signifier que vous voulez des entiers comme résultats.


@Zak merci, j'ai ajouté ça, même si c'est juste sur le titre "Formater un nombre flottant ..."


6 Réponses :


0
votes

Si vous pouvez garantir que vous n'obtenez qu'un zéro à la fin, la conversion en int vous en débarrasse:

>>> 4/2
2.0
>>> int(4/2)
2


1 commentaires

Je ne saurai pas à l'avance quel nombre je divise. Donc, avoir à vérifier un dénominateur de mod numérateur == 0 semble d'abord trop pour cela. Il devrait y avoir une solution plus simple.



0
votes
#  // => used for integer output
#   / => used for double output
x = 100/35      # => 2.857142857142857
y = 100//35     # => 2
z = 100.//35    # => 2.0    # floating-point result if divisor or dividend real

1 commentaires

Bien que ce soit une explication valable du fonctionnement de la division dans Python 3, la question semble être plus sur le formatage et elle a été mise à jour avec "Je ne veux pas simplement une simple division entière", ce qui exclut cette solution.



0
votes

Mod est une opération O (1) qui ne devrait ajouter pratiquement aucune surcharge à votre programme actuel. Vous pouvez également en faire une ligne unique

x = a // b sinon a% b else a / b

Si vous avez besoin de faire ce genre de chose beaucoup, en faire une fonction

def func(a, b):
    return a//b if not a % b else a/b
func(10, 2)      # out = 5
func(10, 3)      # out = 3.333333333
func(1200, 100)  # out = 12
func(1234, 1000) # out = 1.234


1 commentaires

Si vous êtes vraiment préoccupé par les performances, j'utiliserais divmod () pour éviter de faire la division deux fois. Donc: int_result, reste = divmod (a, b); retourne a / b si reste sinon int_result



2
votes

Merci à tous pour votre aide! La réponse est venue de @vaultah:

>>> f'{2.1:g}'
'2.1'
>>> f'{2.0:g}'
'2'

Donc, utilisez simplement une division régulière telle que 4/2, puis formatez la chaîne. À partir de la documentation pour 'g': https: // docs.python.org/2/library/string.html#format-specification-mini-language "les zéros de fin insignifiants sont supprimés du significand, et la virgule décimale est également supprimée s'il ne reste aucun chiffre le suivant."


3 commentaires

Voudriez-vous expliquer comment cela fonctionne? Cela me semble un peu énigmatique. Et comment appliquez-vous cela à votre situation (c'est-à-dire lorsque vous ne connaissez pas les chiffres à l'avance)?


@Wovano a raison, vous devriez expliquer ce qui se passe. L'option g est assez obscure mais la documentation à ce sujet peut être trouvée ici: docs.python.org/2/library/... . Faites défiler vers le bas juste un peu et vous trouverez "les zéros de fin insignifiants sont supprimés du significand, et le point décimal est également supprimé s'il n'y a plus de chiffres qui le suivent."


@SyntaxVoid, merci, mais en fait j'ai été plus surpris par la partie f '..' ;-) Apparemment, c'est un chaîne littérale formatée , qui est une nouveauté de Python 3.6. Je pense que la solution devrait être mise à jour pour inclure également ces informations, d'autant plus qu'elle ne fonctionnera pas pour quiconque utilise Python <= 3.5.



1
votes

Vous pouvez utiliser quelque chose comme ceci:

def remove_trailing_zeros(x):
    return str(x).rstrip('0').rstrip('.')

remove_trailing_zeros(1.23)  # '1.23'
remove_trailing_zeros(4.0)  # '4

Normalement, vous utiliseriez des options de formatage de chaîne standard comme '% 2.1f'% number ou l'une des autres de nombreuses façons de formater une chaîne. Cependant, vous devrez alors spécifier le nombre de chiffres que vous souhaitez afficher, mais dans ce cas, le nombre de zéros de fin à renvoyer est variable. Le spécificateur de format '% g' n'a pas ce problème, mais utilise la notation scientifique et je ne sais pas si c'est ce que veut l'OP.

La solution ci-dessus convertit le nombre en "représentation sous forme de chaîne joliment imprimable" ( str (x) ), puis supprime les zéros de fin ( .rstrip ('0') ) et si nécessaire le point de fin restant ( .rstrip ('.') code>) (pour éviter "1" en conséquence) en utilisant des méthodes de chaîne standard.


0 commentaires

2
votes

C'est un comportement "correct" d'avoir des "flottants" comme résultat, et la partie .0 indique simplement ce fait. Je pense que ce qui compte pour vous, c'est la "représentation" du résultat dans la chaîne. Vous ne devez donc pas modifier le résultat réel et ne changer que la façon dont il est "affiché". Utilisez le mini-langage de formatage :

>>> for val in (123000/1000, 4/2, 1234/1000): print(f"{val:g}")  # Use "General format" to represent floats
...                                                                                                                                                                                                                              
123                                                                                                                                                                                                                              
2                                                                                                                                                                                                                                
1.234


0 commentaires