Question

J'ai deux valeurs entières a et b, mais je dois leur rapport en virgule flottante. Je sais que a < b et je veux calculer a / b, donc si j'utilise la division entière je reçois toujours 0 avec un reste de a.

Comment puis-je force c être un nombre à virgule flottante en Python dans ce qui suit?

c = a / b
Était-ce utile?

La solution

En Python 2, division de deux ints produit un int. En Python 3, il produit un flotteur. Nous pouvons obtenir le nouveau comportement par l'importation de __future__.

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663

Autres conseils

Vous pouvez lancer flotter en faisant c = a / float(b). Si le numérateur ou le dénominateur est un flotteur, alors le résultat sera aussi.


Une mise en garde: comme les commentateurs l'ont souligné, cela ne fonctionnera pas si b pourrait être autre chose qu'un nombre entier ou à virgule flottante (ou une chaîne représentant un). Si vous pourriez avoir affaire à d'autres types (tels que les nombres complexes), vous devrez soit vérifier pour ceux ou utiliser une autre méthode.

  

Comment puis-je division force à virgule flottante en Python?

     

I ai deux valeurs entières A et B, mais je besoin de leur rapport en virgule flottante. Je sais que      

Comment puis-je forcer c être un nombre à virgule flottante en Python dans ce qui suit?

c = a / b

Ce qui est demandé vraiment ici est:

"Comment puis-je forcer vrai division telle que a / b renverra une fraction?"

Mise à niveau Python 3

En Python 3, pour obtenir vraie division, vous faites simplement a / b.

>>> 1/2
0.5

division étage, le comportement de division classique pour les entiers, est maintenant a // b:

>>> 1//2
0
>>> 1//2.0
0.0

Cependant, vous pouvez être coincé en utilisant Python 2, ou vous pouvez écrire du code qui doit fonctionner dans les deux 2 et 3.

Si Utiliser Python 2

En Python 2, il est pas si simple. Voici quelques façons de faire face à la division Python 2 classique sont meilleurs et plus robustes que d'autres.

Recommandation pour Python 2

Vous pouvez obtenir le comportement de division Python 3 dans un module donné à l'importation suivant en haut:

from __future__ import division

qui applique alors la division de style Python 3 au module entier. Il travaille également dans une coquille de python à un moment donné. En Python 2:

>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0

Ceci est vraiment la meilleure solution car il garantit que le code dans votre module est plus compatible avec Python avant 3.

Autres options pour Python 2

Si vous ne voulez pas appliquer à l'ensemble du module, vous êtes limité à quelques solutions de contournement. Le plus populaire est de contraindre l'un des opérandes à un flotteur. Une solution robuste est a / (b * 1.0). Dans un shell Python frais:

>>> 1/(2 * 1.0)
0.5

Aussi robuste est truediv à partir du module operator operator.truediv(a, b), mais cela est probablement plus lent, car il est un appel de fonction:

>>> from operator import truediv
>>> truediv(1, 2)
0.5

Recommandé pour Python Non 2

vu est a / float(b). Cela soulèvera un TypeError si b est un nombre complexe. Étant donné que la division avec des nombres complexes est défini, il est logique de moi de ne pas avoir division échec lorsqu'il est passé un nombre complexe pour le diviseur.

>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float

Il ne fait pas de sens pour moi de faire délibérément votre code plus fragile.

Vous pouvez également exécuter Python avec le drapeau de -Qnew, mais cela a l'inconvénient d'exécuter tous les modules avec le nouveau comportement Python 3, et certains de vos modules peuvent attendre la division classique, donc je ne recommande pas, sauf pour les tests. Mais pour démontrer:

$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j
c = a / (b * 1.0)

En Python 3.x, la division barre oblique unique (/) signifie toujours vrai (non tronquer). (L'opérateur // est utilisé pour la division tronquer.) En Python 2.x (2.2 et plus), vous pouvez obtenir ce même comportement en mettant un

from __future__ import division

en haut de votre module.

Il suffit de faire l'un des paramètres de division au format en virgule flottante produit également la sortie en virgule flottante.

Exemple:

>>> 4.0/3
1.3333333333333333

ou

>>> 4 / 3.0
1.3333333333333333

ou

>>> 4 / float(3)
1.3333333333333333

ou

>>> float(4) / 3
1.3333333333333333

Ajouter un point (.) pour indiquer les nombres à virgule flottante

>>> 4/3.
1.3333333333333333

Cela permettra également de travailler

>>> u=1./5
>>> print u
0.2

Si vous voulez utiliser « true » division (virgule flottante) par défaut, il est un indicateur de ligne de commande:

python -Q new foo.py

Il y a quelques inconvénients (du PEP):

  

Il a été avancé qu'une option de ligne de commande pour changer la         par défaut est le mal. Il peut certainement être dangereux dans le mauvais         mains: par exemple, il serait impossible de combiner 3         partie package de bibliothèque qui nécessite -Qnew entre eux qui         exige -Qold.

Vous pouvez en savoir plus sur les autres valeurs de drapeaux qui changent / warn-sur le comportement de la division en regardant la page de manuel python.

Pour plus de détails sur les modifications de la division lecture: PEP 238 - Modification l'opérateur Division

from operator import truediv

c = truediv(a, b)
from operator import truediv

c = truediv(a, b)

où est dividende et b est le diviseur. Cette fonction est pratique lorsque quotient après la division de deux entiers est un flotteur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top