Come posso forzare la divisione in virgola mobile in Python?
Ho due valori interi aeb, ma ho bisogno del loro rapporto in virgola mobile. So che a <b e voglio calcolare a / b, quindi se uso la divisione intera otterrò sempre 0 con il resto di a.
Come posso forzare c ad essere un numero in virgola mobile in Python nel seguito?
c = a / b
Ciò che viene veramente chiesto qui è:
"Come posso forzare la vera divisione in modo tale a / b
restituire una frazione?"
Esegui l'upgrade a Python 3
In Python 3, per ottenere la vera divisione, lo fai semplicemente a / b
.
>>> 1/2
0.5
La divisione dei piani, il classico comportamento di divisione per gli interi, è ora a // b
:
>>> 1//2
0
>>> 1//2.0
0.0
Tuttavia, potresti essere bloccato usando Python 2 o potresti scrivere codice che deve funzionare sia in 2 che in 3.
Se si utilizza Python 2
In Python 2, non è così semplice. Alcuni modi di gestire la classica divisione Python 2 sono migliori e più robusti di altri.
Raccomandazione per Python 2
È possibile ottenere il comportamento della divisione Python 3 in un determinato modulo con la seguente importazione in alto:
from __future__ import division
che quindi applica la divisione di stile Python 3 all'intero modulo. Funziona anche in una shell Python in un dato punto. In Python 2:
>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0
Questa è davvero la soluzione migliore in quanto garantisce che il codice nel modulo sia più compatibile con Python 3.
Altre opzioni per Python 2
Se non si desidera applicare questo all'intero modulo, si è limitati ad alcune soluzioni alternative. Il più popolare è di forzare uno degli operandi su un float. Una soluzione solida è a / (b * 1.0)
. In una nuova shell Python:
>>> 1/(2 * 1.0)
0.5
Anche robusto è truediv
dal operator
modulo operator.truediv(a, b)
, ma questo è probabilmente più lento perché è una chiamata di funzione:
>>> from operator import truediv
>>> truediv(1, 2)
0.5
Non consigliato per Python 2
Comunemente visto a / float(b)
. Ciò genererà un errore di tipo se b è un numero complesso. Dato che la divisione con numeri complessi è definita, per me ha senso non fallire la divisione quando viene passato un numero complesso per il divisore.
>>> 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
Non ha molto senso per me rendere intenzionalmente il tuo codice più fragile.
Puoi anche eseguire Python con il -Qnew
flag, ma questo ha il rovescio della medaglia di eseguire tutti i moduli con il nuovo comportamento di Python 3 e alcuni dei tuoi moduli potrebbero aspettarsi una divisione classica, quindi non lo consiglio tranne per i test. Ma per dimostrare:
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j