2015-11-25 21 views
9

Ottengo un float dividendo due numeri. So che i numeri sono divisibili, quindi ho sempre un numero intero, solo che è di tipo float. Tuttavia, ho bisogno di un tipo int reale. So che lo int() spoglia i decimali (cioè l'arrotondamento del pavimento). Sono preoccupato dal fatto che i galleggianti non sono esatti, se lo faccio ad es. int(12./3) o int(round(12./3)) può finire come 3 invece di 4 perché la rappresentazione in virgola mobile di 4 potrebbe essere 3.9999999593519561 (non è, solo un esempio).Il lancio di un intero "intero" su int restituirà sempre il numero intero più vicino?

Ciò accadrà mai e posso assicurarmi che non accada?

(chiedo perché mentre rimodellare una matrice NumPy, ho ricevuto un avviso dicendo che la forma deve essere interi, non galleggia.)

+4

perché non usi semplicemente la divisione di interi? – lejlot

+0

Sì, ci ho pensato subito dopo aver postato. Stava per aggiornare la domanda, ma lascerei che il tuo commento parlasse invece. – cmeeren

+0

Tuttavia, se lo faccio ad es. 3.5/0.5 quindi non è possibile. (Io no, divido due interi, ma per ragioni ...) – cmeeren

risposta

4

Casting un float a un integer tronca il valore, quindi se avete 3.999998 e lo lanci su un integer, ottieni 3.

Il modo per evitare questo è arrotondare il risultato. int(round(3.99998)) = 4, poiché la funzione rotonda restituisce sempre un valore integrale preciso.

+0

Come può la funzione round restituire un valore integrale preciso quando restituisce un valore float? – cmeeren

+0

Un float è un numero decimale con una lunghezza limitata, tranne che con cifre binarie anziché cifre 0-9. Può contenere i valori interi con precisione, come 3453.0.Ci sono molti numeri che non può contenere con precisione, come 1/3 = 0.3333 ..., perché la sua lunghezza è limitata. –

+1

@cmeeren: la spinta di questa risposta è corretta, ** per la domanda dichiarata **. È vero che 'round' non darà risultati" intuitivi "in cui il valore float è vicino a un limite di arrotondamento, come' round (2.675, 2) '(questo esempio è dato direttamente nella documentazione). Ma la tua domanda specifica in modo specifico che tu sappia che i tuoi valori dovrebbero essere integrali e che si arrotonderanno come previsto. –

1

L'arrotondamento può essere simulato aggiungendo 0,5 al valore in questione. Per esempio:

>>> int(3.4) 
3 
>>> int(3.7) 
3 
>>> int(3.4 + 0.5) # 3.9 
3 
>>> int(3.7 + 0.5) # 4.2 
4 
+0

In C, aggiungendo 0,5 per arrotondare un numero non riesce per 1) molti numeri negativi, 2) Il numero appena più piccolo di 0,5, 3) molti numeri 'float 'con ULP di 0,5 4) molti valori' float' con ULP di 1,0. Sospetti problemi simili con Python. – chux

+0

Nessuno di questi casi speciali viene generato dal codice dell'OP. – chepner

1

ho finito per usare la divisione intera (a//b) da quando ho diviso interi. Non avrei funzionato se mi fossi diviso per es. 3.5/0.5 = 7 però.

Problemi correlati