Recentemente, notei que int()
arredonda um flutuador em direção a 0, enquanto a divisão inteira arredonda um flutuador em direção ao seu piso.
por exemplo:
-7 // 2 = -4
int(-7/2) = -3
Eu li a documentação que especifica:
classe int (x, base = 10)
Retorne um objeto inteiro construído a partir de um número ou string x ou retorne 0 se nenhum argumento for fornecido. Se x é um número, retorne x. int (). Para números de ponto flutuante, isso é truncado para zero.
e:
divisão de piso
Divisão matemática que arredonda para baixo para o número inteiro mais próximo. O operador da divisão de piso é //. Por exemplo, a expressão 11 // 4 é avaliada como 2 em contraste com os 2,75 retornados pela divisão verdadeira float. Observe que (-11) // 4 é -3 porque é -2,75 arredondado para baixo. Ver PEP 238.
Mas parece ilógico para mim que 2 operações semelhantes (divisão de flutuação para inteiro) devam retornar resultados diferentes.
Existe alguma motivação para as diferenças entre as funções?
Obrigado.
fonte
Respostas:
Consistência.
Você precisará seguir algumas explicações muito básicas e aparentemente irrelevantes para entendê-lo.
Na escola, você aprendeu a divisão com o restante. E você fez cálculos como este:
Mais tarde, você aprendeu divisões para números reais:
Até esse ponto, você pode acreditar nisso
x // 4
eint(x/4)
sempre fornecer o mesmo resultado. Essa é a sua compreensão atual da situação.No entanto, observe o que acontece na divisão inteira: o número atrás de R alterna entre 3, 2, 1 e 0 e reinicia: 3, 2, 1, 0. O número na frente de R decresce a cada 4º passo.
Então, como vai continuar?
Ao mesmo tempo, a divisão de números reais nos fornece:
É por isso
-1 // 4
dá -1, masint(-1/4)
dá 0.Bem, eles servem a propósitos diferentes:
//
faz parte de um cálculo inteiro com restos eint()
fornece a parte na frente do.
de uma operação de número real.Você decide o que deseja calcular e decide qual operador usar no Python para obter o resultado correto.
Boa pergunta. Continue aprendendo.
fonte
//
operador no python 3 é para evitar forçar o uso de int (float). Se este não for o caso, quando eu deveria optar por implementar usandoint()
e quando devo implementar usando//
Math.Floor(3.23) != -Math.Floor(-3.23)
pelo mesmo motivo,-((-x)//y)
não é necessáriox//y
.Eu diria que sua observação de que essas duas operações devem ser intuitivamente semelhantes é esperada, pois em números positivos elas se comportam de forma idêntica. Mas se você olhar para as suas origens (uma vem da matemática e a outra da ciência da computação), então faz mais sentido o seu comportamento diferente.
Você pode olhar por trás dos conceitos:
==================================================== ================
I) Divisão de piso, também conhecida como função de piso, aplicada à divisão matemática
A função de piso é um conceito muito bem estabelecido em matemática.
Do mathworld.wolfram :
Portanto, a divisão do piso nada mais é do que a função do piso aplicada à divisão matemática. O comportamento é muito claro, "matematicamente preciso".
II) Conversão de tipo / fundição de tipo
Da wikipedia :
Na maioria das linguagens de programação, o formulário de conversão flutuante para inteiro é aplicado pela regra de arredondamento (portanto, existe uma convenção):
Regra de arredondamento de acordo com a IEEE 754 .
Portanto, em outras palavras, a razão da diferença entre divisão inteira e conversão float para int em python é matemática, aqui estão alguns pensamentos de Guido van Rossum (acho que não preciso apresentá-lo: D) blog A história do Python, artigo "Por que a divisão inteira do Python flutua" )
fonte