La divisione intera Python produce 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

Questo è previsto? Ricordo fortemente che le versioni precedenti sono tornate int/int=int? Cosa devo fare, c'è un nuovo operatore di divisione o devo sempre scegliere?


31
Sì, è così che funziona la divisione in 3.x.
hughdbrown,

2
Ecco un post del creatore di Python che parla di come funziona l'arrotondamento, è ortogonale alla tua domanda ma l'ho trovato interessante: python-history.blogspot.com/2010/08/…
Aaron D,

@hughdbrown, questo significa essenzialmente per tutte le versioni di Python 3?
Charlie Parker

@hughdbrown: sì, PEP è definitivo , il che significa sia accettato che implementato.
Jonas Byström,

Risposte:


285

Dai un'occhiata a PEP-238 : Cambio dell'operatore di divisione

L'operatore // sarà disponibile per richiedere inequivocabilmente la divisione dei piani.


10
@JonathanSternberg ad eccezione di tutto il codice scritto per Python 2.0. Sento che il ruolo di / e // dovrebbe essere invertito per mantenere la retrocompatibilità. Inoltre, praticamente in ogni altra lingua / tipo di conservazione. avrei più senso quindi che // si convertisse automaticamente in float, non /.
Grazie

1
La seconda parte (dopo "Anche") ha senso (somiglianza con altre lingue) ma per quanto riguarda la prima parte, l'intero punto di Python 3 NON doveva essere compatibile con Python 2, ma piuttosto risolvere un sacco di problemi con Python 2. Abbastanza persone hanno trovato l'ambiguità di /essere sufficienti per un "errore" di progettazione del linguaggio che doveva essere corretto in Python 3. Potrebbe essere stata una decisione controversa, ma abbastanza persone hanno ritenuto che fosse quella corretta. Contami nel gruppo che ama il cambiamento. È bello che possiamo essere tutti d'accordo di non essere d'accordo. Saluti. :)
Ray Toal,

59

Oops, trovato immediatamente 2//2.


5
Potresti elaborare?
blueFast,

4
L'uso di questo genererà un int, non un float @dangonfast.
Ashish Ahuja,

Questo sembra non funzionare con numeri negativi. -1 // 5 restituisce -1 e -5 // 5 restituisce -1.
mschuett

@mschuett: questo è prevedibile, ed è lo stesso risultato di Python 2.
Jonas Byström,

1
Sì, ho fatto qualche altro scavo e l'ho scoperto anche io. Immagino comunque che un numero di persone decente non se ne renda conto a seconda della lingua da cui provengono.
mschuett,

45

Spero che possa aiutare qualcuno all'istante.

Comportamento di Division Operator in Python 2.7 e Python 3

In Python 2.7: per impostazione predefinita, l'operatore di divisione restituirà l'output intero.

per ottenere il risultato in doppio multiplo 1,0 in "dividendo o divisore"

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

In 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 proposito, non è necessario moltiplicare per 1,0. È sufficiente che uno dei numeri sia un float. Ad esempio, 100 / 35.0 = 100.0 / 35 = 2.857142857142857
Tal J. Levy,

21

La risposta accettata menziona già PEP 238 . Voglio solo dare una rapida occhiata dietro le quinte per coloro che sono interessati a quello che sta succedendo senza leggere l'intero PEP.

Python mappe operatori come +, -, *e /alle funzioni speciali, come ad esempio, che a + bè equivalente a

a.__add__(b)

Per quanto riguarda la divisione in Python 2, esiste per impostazione predefinita solo /che mappa __div__e il risultato è dipendente dal tipo di ingresso (ad esempio int, float).

Python 2.2 ha introdotto la __future__funzione division, che ha modificato la semantica della divisione nel modo seguente (TL; DR di PEP 238):

  • /mappe alle __truediv__quali deve "restituire una ragionevole approssimazione del risultato matematico della divisione" (citazione da PEP 238)
  • //mappe a __floordiv__, che dovrebbero restituire il risultato di/

Con Python 3.0, le modifiche di PEP 238 sono diventate il comportamento predefinito e non esiste un metodo speciale __div__nel modello a oggetti di Python.

Se si desidera utilizzare lo stesso codice in Python 2 e Python 3, utilizzare

from __future__ import division

e attenersi alla semantica PEP 238 di /e //.


0

Secondo la documentazione di Python3, python quando diviso per intero, genererà float nonostante ci si aspetti che sia intero.

Per stampare esclusivamente numeri interi, utilizzare floor division method. La divisione del piano sta arrotondando lo zero e rimuovendo il punto decimale.Represented by //

Quindi, anziché 2/2, utilizzare 2//2

Puoi anche importare la divisione __future__indipendentemente dall'utilizzo di python2 o python3.

Spero che sia d'aiuto!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.