Eu tenho dois valores inteiros a
e b
, mas preciso da proporção deles em ponto flutuante. Eu sei disso a < b
e quero calcular a / b
, portanto, se eu usar a divisão inteira, sempre receberei 0 com o restante a
.
Como forçar c
a ser um número de ponto flutuante no Python a seguir?
c = a / b
python
floating-point
integer
division
python-2.x
Nathan Fellman
fonte
fonte
Respostas:
No Python 2, a divisão de duas entradas produz um int. No Python 3, ele produz um float. Podemos obter o novo comportamento importando de
__future__
.fonte
from __future__ import division
deve estar no início do arquivo//
quando deseja divisão de piso e/
quando desejafloat
divisão "true" ( ).Você pode lançar para flutuar fazendo
c = a / float(b)
. Se o numerador ou o denominador for flutuante, o resultado será também.Uma ressalva: como os comentaristas apontaram, isso não funcionará se
b
for algo diferente de um número inteiro ou de ponto flutuante (ou uma string representando um). Se você estiver lidando com outros tipos (como números complexos), precisará verificar esses ou usar um método diferente.fonte
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
.A divisão de piso, o comportamento clássico de divisão para números inteiros, agora é
a // b
: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:
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:
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:Também robusto é
truediv
dooperator
módulooperator.truediv(a, b)
, mas é provavelmente mais lento porque é uma chamada de função: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.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:fonte
fonte
No Python 3.x, a única barra (
/
) sempre significa divisão verdadeira (não truncante). (O//
operador é usado para truncar a divisão.) No Python 2.x (2.2 e superior), você pode obter esse mesmo comportamento colocando umna parte superior do seu módulo.
fonte
Apenas a criação de qualquer um dos parâmetros para divisão no formato de ponto flutuante também produz a saída em ponto flutuante.
Exemplo:
ou,
ou,
ou,
fonte
1.0 + 1/3
oufloat(c) + a/b
ou mais tardefloat(a/b)
e ficará desapontado com a resposta. Melhor usar o python 3+ ou importar o__future__.division
módulo (veja a resposta aceita), para obter sempre a resposta que você espera. As regras de divisão existentes criam um erro matemático insidioso e difícil de rastrear.python -c 'a=10; b=3.0; print a/b'
?a
e se e 'b', por exemplo, as saídas de uma função de valor inteiro? Por exemploa = len(list1), b = len(list2)
,.float(..)
. Eu acho que multiplicar1.0
, como @Pinochle sugeriu abaixo, também pode ser útil.Adicione um ponto (
.
) para indicar números de ponto flutuantefonte
float()
uma das variáveis.Isso também vai funcionar
fonte
a
eb
../
era um operador válido em python que permite fazer a divisão de ponto flutuante. É por isso que é bom para usar espaço em branco judiciosamente, em qualquer linguagem de programaçãoSe você deseja usar a divisão "true" (ponto flutuante) por padrão, há um sinalizador de linha de comando:
Existem algumas desvantagens (do PEP):
Você pode aprender mais sobre os outros valores de sinalizadores que alteram / alertam sobre o comportamento da divisão, consultando a página de manual python.
Para detalhes completos sobre as mudanças de divisão, leia: PEP 238 - Mudando o Operador de Divisão
fonte
fonte
a
int eb
float. Uma solução melhor na mesma linha é fazerfrom operator import truediv
e usartruediv(a, b)
.onde a é dividendo eb é o divisor. Esta função é útil quando quociente após a divisão de dois números inteiros é um ponto flutuante.
fonte