J'ai deux valeurs entières a
et b
, mais j'ai besoin de leur rapport en virgule flottante. Je sais cela a < b
et je veux calculer a / b
, donc si j'utilise la 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
python
floating-point
integer
division
python-2.x
Nathan Fellman
la source
la source
Réponses:
En Python 2, la division de deux entiers produit un int. En Python 3, il produit un flottant. Nous pouvons obtenir le nouveau comportement en important depuis
__future__
.la source
from __future__ import division
doit être au tout début du fichier//
quand vous voulez une division au sol, et/
quand vous voulez unefloat
division "true" ( ).Vous pouvez lancer pour flotter en faisant
c = a / float(b)
. Si le numérateur ou le dénominateur est un flottant, le résultat sera également.Une mise en garde: comme l'ont souligné les commentateurs, cela ne fonctionnera pas s'il
b
pourrait être autre chose qu'un nombre entier ou à virgule flottante (ou une chaîne représentant un). Si vous avez affaire à d'autres types (tels que des nombres complexes), vous devrez soit les vérifier, soit utiliser une méthode différente.la source
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
.La division au sol, le comportement de division classique pour les entiers, est désormais
a // b
: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:
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:
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:Aussi robuste
truediv
duoperator
module deoperator.truediv(a, b)
, mais cela est probablement plus lent , car il est un appel de fonction: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.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:la source
la source
Dans Python 3.x, la barre oblique unique (
/
) signifie toujours une véritable division (non tronquée). (L'//
opérateur est utilisé pour tronquer la division.) En Python 2.x (2.2 et supérieur), vous pouvez obtenir ce même comportement en mettant unen haut de votre module.
la source
La simple création de l'un des paramètres de division au format virgule flottante produit également la sortie en virgule flottante.
Exemple:
ou,
ou,
ou,
la source
1.0 + 1/3
oufloat(c) + a/b
oufloat(a/b)
et vous serez déçu de la réponse. Mieux vaut utiliser python 3+ ou importer le__future__.division
module, (voir réponse acceptée), pour toujours obtenir la réponse que vous attendez. Les règles de division existantes créent une erreur mathématique insidieuse et difficile à retracer.python -c 'a=10; b=3.0; print a/b'
?a
et 'b', par exemple, sont les sorties d'une fonction de valeur entière? Par exemple,a = len(list1), b = len(list2)
.float(..)
. Je pense que la multiplication par1.0
, comme l'a suggéré @Pinochle ci-dessous, pourrait également être utile.Ajoutez un point (
.
) pour indiquer les nombres à virgule flottantela source
float()
sur l'une des variables.Cela fonctionnera également
la source
a
etb
../
c'était un opérateur valide en python qui vous permet de faire une division en virgule flottante. C'est pourquoi il est bon d'utiliser judicieusement les espaces blancs, dans n'importe quel langage de programmationSi vous souhaitez utiliser la division "true" (virgule flottante) par défaut, il existe un indicateur de ligne de commande:
Il y a quelques inconvénients (du PEP):
Vous pouvez en savoir plus sur les autres valeurs de drapeaux qui modifient / avertissent du comportement de la division en consultant la page de manuel python.
Pour plus de détails sur les changements de division, lisez: PEP 238 - Changement d'opérateur de division
la source
la source
a
est un int etb
est un flottant. Une meilleure solution dans le même sens est de fairefrom operator import truediv
puis d'utilisertruediv(a, b)
.où a est le dividende et b est le diviseur. Cette fonction est pratique lorsque le quotient après division de deux entiers est un flottant.
la source