Question Comment puis-je forcer la division à virgule flottante? La division continue d'arrondir à 0


J'ai deux valeurs entières a et b, mais j'ai besoin de leur ratio en virgule flottante. je le sais a<b et je veux calculer a/b, donc si j'utilise la division entière, je vais toujours obtenir 0 avec un reste de a.

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

c = a / b

614
2017-08-12 18:25


origine


Réponses:


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

708
2017-08-12 18:28



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


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


666
2017-08-12 18:28



c = a / (b * 1.0)

125
2017-08-12 18:26



Comment puis-je forcer la division à être à virgule flottante en Python?

J'ai deux valeurs entières a et b, mais j'ai besoin de leur ratio 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 dans Python dans ce qui suit?

c = a / b

Ce qui est vraiment demandé ici est:

"Comment puis-je forcer la vraie division telle que a / b retournera une fraction? "

Mise à niveau vers Python 3

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

>>> 1/2
0.5

Division du plancher, 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 à la fois en 2 et en 3.

Si vous utilisez Python 2

En Python 2, ce n'est pas si simple. Certaines façons de gérer la division classique de Python 2 sont meilleures et plus robustes que d'autres.

Recommandation pour Python 2

Vous pouvez obtenir le comportement de division Python 3 dans un module donné 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 à un 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 voulez pas l'appliquer à l'ensemble du module, vous êtes limité à quelques solutions de contournement. Le plus populaire est de contraindre l'un des opérands à 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 du operator module operator.truediv(a, b), mais cela est probablement plus lent car c'est un appel de fonction:

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

Non recommandé pour Python 2

Communément vu est a / float(b). Cela déclenchera une erreur TypeError si b est un nombre complexe. Puisque la division avec des nombres complexes est définie, il est logique pour moi de ne pas avoir de division échouée quand un nombre complexe est passé 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 -Qnew flag, mais cela a l'inconvénient d'exécuter tous les modules avec le nouveau comportement de Python 3, et certains de vos modules peuvent s'attendre à une division classique, donc je ne le 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

104
2017-09-18 17:29



En Python 3.x, la barre oblique unique (/) signifie toujours une division vraie (non-tronquée). (Le // l'opérateur est utilisé pour tronquer la division.) Dans Python 2.x (2.2 et supérieur), vous pouvez obtenir ce même comportement en mettant un

from __future__ import division

en haut de votre module.


63
2017-08-12 18:30



Le simple fait de faire l'un des paramètres pour la division au format à 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

29
2017-09-24 06:22



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

>>> 4/3.
1.3333333333333333

ou

>>> from __future__ import division
>>> 4/3
1.3333333333333333

19
2017-11-22 14:39



Cela fonctionnera également

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

0,2


12
2017-12-24 19:58



Si vous souhaitez utiliser la division "true" (virgule flottante) par défaut, il existe un indicateur de ligne de commande:

python -Q new foo.py

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

Il a été soutenu qu'une option de ligne de commande pour changer le         le défaut est le mal. Il peut certainement être dangereux dans le mauvais         mains: par exemple, il serait impossible de combiner un 3ème         paquet de bibliothèque de partie qui exige -Qnew avec un autre qui         exige -Qold.

Vous pouvez en apprendre plus sur les autres valeurs de drapeaux qui changent / avertissent sur le comportement de la division en regardant la page man python.

Pour plus de détails sur les changements de division lire: PEP 238 - Changer l'opérateur de division


6
2018-01-07 18:33