2015-07-20 15 views
10

Non riesco a trovare la risposta a questo in questo sito, anche se sembra che sia abbastanza comune. Sto provando a generare un doppio per il rapporto del numero di linee in due file.Converti int in double Python

#Number of lines in each file 
inputLines = sum(1 for line in open(current_file)) 
outputLines = sum(1 for line in open(output_file)) 

quindi ottenere il rapporto:

ratio = inputLines/outputLines 

Ma il rapporto sembra sempre di essere un int e colpi anche se inizializzare piace:

ratio = 1.0 

Grazie.

risposta

20

In python , il risultato di una divisione di due numeri interi è sempre un numero intero. Per forzare una divisione galleggiante, è necessario utilizzare almeno un galleggiante nella divisione:

ratio = float(inputLines)/outputLines

Fare attenzione a non fare ratio = float(inputLines/outputLines): anche se questo si traduce in un galleggiante, è quello ottenuto dopo fare la divisione intera, in modo che il risultato sarà "sbagliato" (come in "non quello che ci si aspetta")

in Python , the integer division behavior was changed, e una divisione di due numeri interi risultati in un galleggiante. Puoi anche usare questa funzionalità in python 2.7, inserendo from __future__ import division nell'accattimento dei tuoi file.


Il motivo ratio = 1.0 non funziona è che tipi (in Python) sono una proprietà di valori, non variabili - in altre parole, le variabili non hanno i tipi.

a= 1.0 # "a" is a float 
a= 1 # "a" is now a integer 
+0

Ah, ha senso, grazie. –

1

È necessario eseguire il cast di uno dei termini su un valore in virgola mobile. O esplicitamente utilizzando float (ovvero ratio = float(a)/b o ratio=a/float(b)) o implicitamente aggiungendo 0.0: ratio = (a+0.0)/b.

Se si utilizza Python 2 è possibile from __future__ import division rendere la divisione non quella integrale ma quella mobile.

1

In effetti, Python 2 restituisce un numero intero quando si divide un numero intero. È possibile ignorare questo comportamento per lavorare come in Python 3, dove int/int = float ponendo questo nella parte superiore del file:

from __future__ import division 

O meglio ancora, basta smettere di usare Python 2 :)

3

Si sta utilizzando Python 2.x?

Provare a utilizzare

>>> from __future__ import division 
>>> ratio = 2/5 
0.4 

per ottenere un float da una divisione.

L'inizializzazione con ratio = 1.0 non funziona perché con ratio = inputLines/outputLines si sta riassegnando la variabile a int, indipendentemente da cosa fosse prima.