2009-11-24 3 views
8

Considerare:Perché questa divisione non funziona in Python?

>>> numerator = 29 
>>> denom = 1009 
>>> print str(float(numerator/denom)) 
0.0 

Come faccio a farlo tornare un decimale?

+1

Un po 'a parte, ma 'float' non è uguale al tipo' Decimal' nella libreria standard Python. Quando dici "Voglio solo che restituisca un decimale", ciò che intendi veramente è "Voglio solo che restituisca una stringa che rappresenta un valore frazionario in notazione decimale", giusto? –

risposta

24

Fino alla versione 3, l'operatore di divisione Python, /, si comportava come un operatore di divisione di C quando veniva presentato con due argomenti interi: restituisce un risultato intero che viene troncato quando ci sarà una parte frazionaria. Vedere: PEP 238

>>> n = 29 
>>> d = 1009 
>>> print str(float(n)/d) 
0.0287413280476 

In Python 2 (e forse anche prima) si potrebbe usare:

>>> from __future__ import division 
>>> n/d 
0.028741328047571853 
+0

-7 // 3 = -3 (resto è = 2) in Python e -7/3 = -2 (resto = -1) in C/C++ quindi non direi che questo comportamento è lo stesso in Python come in C/C++ – Artur

7

In Python 2.x, divisione funziona come lo fa in linguaggi C-like: se entrambi gli argomenti sono interi, il risultato viene troncato su un numero intero, quindi 29/1009 è 0. 0 come float è 0.0. Per risolvere il problema, il cast a un galleggiante prima di dividere:

print str(float(numerator)/denominator) 

In Python 3.x, la divisione agisce in modo più naturale, così avrai il corretto risultato matematico (entro errore in virgola mobile).

0
print str(float(numerator)/float(denom)) 
+0

È sufficiente trasmettere uno degli operandi a float(). In genere consiglio di lanciare il numeratore in quanto colloca il cast all'inizio dell'espressione in cui i lettori lo vedranno normalmente più facilmente. –

+0

Sì, lo è, ma questo mi è sembrato più "giusto" solo perché era più trasparente nel cast. Ma sì, basta colarne uno solo. – inspectorG4dget

1

Nella tua valutazione stai trasmettendo il risultato, devi invece eseguire il cast degli operandi.