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?


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.


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.


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

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 //.


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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.