Divisão inteira do Python produz float

223
Python 3.1 (r31:73574, Jun 26 2009, 20:21:35) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 2/2
1.0

Isso é pretendido? Lembro-me fortemente de versões anteriores voltando int/int=int? O que devo fazer, existe um novo operador de divisão ou devo sempre transmitir?

Jonas Byström
fonte
31
Sim, é assim que a divisão funciona na 3.x.
hughdbrown
2
Aqui está um post do criador do Python falando sobre como o arredondamento funciona, é ortogonal à sua pergunta, mas achei interessante: python-history.blogspot.com/2010/08/…
Aaron D
@hughdbrown, o que significa essencialmente para toda a versão python 3?
Charlie Parker
@hughdbrown: sim, o PEP é final , o que significa aceito e implementado.
Jonas Byström

Respostas:

285

Dê uma olhada no PEP-238 : Mudando o operador da divisão

O operador // estará disponível para solicitar a divisão do andar sem ambiguidade.

Brandon E Taylor
fonte
10
@ JonathanSternberg, exceto por todo o código que foi escrito para o python 2.0. Eu sinto que o papel de / e // deve ser revertido para manter a compatibilidade com versões anteriores. Além disso, em praticamente todos os outros idiomas / tipos de preservação. eu faria mais sentido então // converter automaticamente para flutuar, não /.
thang
1
A segunda parte (depois do "Also") faz sentido (semelhança com outras linguagens), mas com relação à primeira parte, o objetivo principal do Python 3 NÃO era ser compatível com o Python 2, mas sim corrigir um monte de problemas com o Python 2. Muita gente achou a ambiguidade de /ser um "erro" suficiente no design da linguagem que precisava ser corrigido no Python 3. Pode ter sido uma decisão controversa, mas muita gente achou que era a correta. Conte-me no grupo que ama a mudança. É bom que todos concordemos em discordar. Felicidades. :)
Ray Toal
59

Ops, encontrado imediatamente 2//2.

Jonas Byström
fonte
5
Você poderia elaborar?
blueFast
4
Usar isso produzirá um int, não um float @dangonfast.
Ashish Ahuja
Isso parece não funcionar para números negativos. -1 // 5 retorna -1 e -5 // 5 retorna -1.
mschuett
@mschuett: este é de se esperar, e é o mesmo resultado que com Python 2.
Jonas Byström
1
Sim, eu fiz mais algumas escavações e descobri isso também. No entanto, eu imagino que um número decente de pessoas não perceba isso, dependendo do idioma de origem.
26519 mschuett
45

Espero que ajude alguém instantaneamente.

Comportamento do Operador de Divisão no Python 2.7 e Python 3

No Python 2.7: Por padrão, o operador de divisão retornará uma saída inteira.

para obter o resultado em múltiplo duplo 1,0 para "dividendo ou divisor"

100/35 => 2 #(Expected is 2.857142857142857)
(100*1.0)/35 => 2.857142857142857
100/(35*1.0) => 2.857142857142857

No Python 3

// => used for integer output
/ => used for double output

100/35 => 2.857142857142857
100//35 => 2
100.//35 => 2.0    # floating-point result if divsor or dividend real
VijayNaidu
fonte
1
A propósito, não há necessidade de multiplicar por 1,0. Basta que um dos números seja um flutuador. Por exemplo, 100 / 35,0 = 100,0 / 35 = 2,857142857142857
Tal J. Levy
21

A resposta aceita já menciona o PEP 238 . Eu só quero adicionar uma rápida olhada nos bastidores para os interessados ​​no que está acontecendo sem ler todo o PEP.

Python mapeia operadores como +, -, *e /para funções especiais, de tal modo que por exemplo, a + bé equivalente a

a.__add__(b)

Em relação à divisão no Python 2, há por padrão apenas /quais mapas são mapeados __div__e o resultado depende dos tipos de entrada (por exemplo int, float).

O Python 2.2 introduziu o __future__recurso division, que alterou a semântica da divisão da seguinte maneira (TL; DR do PEP 238):

  • /mapas para os __truediv__quais "deve retornar uma aproximação razoável do resultado matemático da divisão" (citação do PEP 238)
  • //mapas para __floordiv__, que devem retornar o resultado do/

Com o Python 3.0, as alterações do PEP 238 se tornaram o comportamento padrão e não há mais método especial __div__ no modelo de objeto do Python.

Se você deseja usar o mesmo código no Python 2 e Python 3, use

from __future__ import division

e mantenha a semântica do PEP 238 de /e //.

code_onkel
fonte
0

De acordo com a documentação do Python3, o python, quando dividido por número inteiro, gerará float, apesar do esperado como número inteiro.

Para imprimir exclusivamente números inteiros, use floor division method. A divisão do piso está arredondando o zero e removendo o ponto decimal.Represented by //

Portanto, em vez de 2/2, use 2//2

Você também pode importar a divisão __future__independentemente de usar python2 ou python3.

Espero que ajude!

addy
fonte