Comment puis-je division force à virgule flottante? Division maintient arrondi à 0?
-
13-09-2019 - |
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
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.