Comment puis-je forcer la division à être flottante en Python?
J'ai deux valeurs entières a et b, mais j'ai besoin de leur rapport en virgule flottante. Je sais que a <b et je veux calculer a / b, donc si j'utilise une division entière, j'obtiendrai toujours 0 avec un reste de a.
Comment puis-je forcer c à être un nombre à virgule flottante en Python dans ce qui suit?
c = a / b
Ce qui est vraiment demandé ici, c'est:
"Comment puis-je forcer une vraie division telle que a / b
cela rendra une fraction?"
Mettre à niveau vers Python 3
En Python 3, pour obtenir une véritable division, il vous suffit de le faire a / b
.
>>> 1/2
0.5
La division au sol, le comportement de division classique pour les entiers, est désormais a // b
:
>>> 1//2
0
>>> 1//2.0
0.0
Cependant, vous pouvez être bloqué en utilisant Python 2, ou vous pouvez écrire du code qui doit fonctionner à la fois dans 2 et 3.
Si vous utilisez Python 2
En Python 2, ce n'est pas si simple. Certaines façons de gérer la division Python 2 classique sont meilleures et plus robustes que d'autres.
Recommandation pour Python 2
Vous pouvez obtenir le comportement de division Python 3 dans n'importe quel module avec l'importation suivante en haut:
from __future__ import division
qui applique ensuite la division de style Python 3 à l'ensemble du module. Il fonctionne également dans un shell python à tout moment donné. En Python 2:
>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0
C'est vraiment la meilleure solution car elle garantit que le code de votre module est plus compatible avec Python 3.
Autres options pour Python 2
Si vous ne souhaitez pas appliquer cela à l'ensemble du module, vous êtes limité à quelques solutions de contournement. Le plus populaire consiste à contraindre l'un des opérandes à un flotteur. Une solution robuste est a / (b * 1.0)
. Dans un nouveau shell Python:
>>> 1/(2 * 1.0)
0.5
Aussi robuste truediv
du operator
module de 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
Non recommandé pour Python 2
On le voit généralement a / float(b)
. Cela déclenchera une TypeError si b est un nombre complexe. Étant donné que la division avec des nombres complexes est définie, il est logique pour moi de ne pas faire échouer la division lors de la transmission d'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
Cela n'a pas beaucoup de sens pour moi de rendre votre code plus fragile.
Vous pouvez également exécuter Python avec l' -Qnew
indicateur, mais cela a l'inconvénient d'exécuter tous les modules avec le nouveau comportement Python 3, et certains de vos modules peuvent s'attendre à une division classique, donc je ne le recommande que pour les tests. Mais pour démontrer:
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j