Como forçar a divisão a ser ponto flutuante no Python?
Eu tenho dois valores inteiros aeb, mas preciso da proporção deles em ponto flutuante. Eu sei que a <be quero calcular a / b, portanto, se eu usar a divisão inteira, sempre receberei 0 com o restante de a.
Como forçar c para ser um número de ponto flutuante no Python a seguir?
c = a / b
O que realmente está sendo perguntado aqui é:
"Como forço uma divisão verdadeira que a / b
retornará uma fração?"
Atualize para o Python 3
No Python 3, para obter uma divisão verdadeira, basta fazê-lo a / b
.
>>> 1/2
0.5
A divisão de piso, o comportamento clássico de divisão para números inteiros, agora é a // b
:
>>> 1//2
0
>>> 1//2.0
0.0
No entanto, você pode ficar preso no Python 2 ou escrever um código que deve funcionar nos 2 e 3.
Se estiver usando Python 2
No Python 2, não é tão simples. Algumas maneiras de lidar com a clássica divisão Python 2 são melhores e mais robustas que outras.
Recomendação para Python 2
Você pode obter o comportamento de divisão do Python 3 em qualquer módulo com a seguinte importação na parte superior:
from __future__ import division
que aplica a divisão de estilos do Python 3 a todo o módulo. Também funciona em um shell python a qualquer momento. No Python 2:
>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0
Esta é realmente a melhor solução, pois garante que o código do seu módulo seja mais compatível com o Python 3.
Outras opções para Python 2
Se você não deseja aplicar isso a todo o módulo, estará limitado a algumas soluções alternativas. O mais popular é coagir um dos operandos a flutuar. Uma solução robusta é a / (b * 1.0)
. Em um shell Python novo:
>>> 1/(2 * 1.0)
0.5
Também robusto é truediv
do operator
módulo operator.truediv(a, b)
, mas é provavelmente mais lento porque é uma chamada de função:
>>> from operator import truediv
>>> truediv(1, 2)
0.5
Não recomendado para Python 2
Comumente visto é a / float(b)
. Isso gerará um TypeError se b for um número complexo. Como a divisão com números complexos é definida, faz sentido para mim não ter falha na divisão quando passou um número complexo para o divisor.
>>> 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
Não faz muito sentido para mim propositadamente tornar seu código mais frágil.
Você também pode executar o Python com o -Qnew
sinalizador, mas isso tem a desvantagem de executar todos os módulos com o novo comportamento do Python 3, e alguns de seus módulos podem esperar uma divisão clássica, por isso não recomendo isso, exceto para testes. Mas para demonstrar:
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j