2015-08-04 23 views
90

Ho cercato per arrotondare numeri float lunghi come:numero tondo al numero intero più vicino

32.268907563; 
32.268907563; 
31.2396694215; 
33.6206896552; 
... 

senza successo finora. Ho provato math.ceil(x), math.floor(x) (anche se questo andrebbe su o giù, che non è quello che sto cercando) e round(x) che non ha funzionato neanche (numeri ancora mobili).

Cosa posso fare?

EDIT: CODICE:

for i in widthRange: 
    for j in heightRange: 
     r, g, b = rgb_im.getpixel((i, j)) 
     h, s, v = colorsys.rgb_to_hsv(r/255.0, g/255.0, b/255.0) 
     h = h * 360 
     int(round(h)) 
     print(h) 
+1

vorrei provare 'int (x)' –

risposta

139
int(round(x)) 

arrotonderà e cambiarlo a intero

EDIT:

Non sta assegnando int (round (h)) per qualsiasi variabile . Quando chiami int (round (h)), restituisce il numero intero ma non fa nient'altro; dovete cambiare quella linea per:

h = int(round(h)) 

Per assegnare il nuovo valore di h

+0

stampa ("4.5)", int (round (4.5))) # mi ha dato 4 print ("5.5)", int (round (5.5))) mi ha dato 6:, ( – Komm

+0

È correlato alla versione Python. Mi dà 5 e 6 usando Python 2.7.9 e, come hai detto, 4 e 6 usando Python 3.4.2 –

+0

Hmm .... sarebbe bello se la funzione round non convertisse i valori in floats. – user48956

14

Usa round(x, y). Arrotonderà il numero fino alla cifra decimale desiderata.

Ad esempio:

>>> round(32.268907563, 3) 
32.269 
8

round(value,significantDigit) è la soluzione ordinaria, tuttavia questo non funziona come ci si aspetterebbe da un punto di vista matematico, quando arrotondare i valori che terminano in 5. Se il numero 5 è nella cifra subito dopo quella a cui si è arrotondato, a volte questi valori vengono arrotondati come previsto (ad esempio arrotondando a due cifre decimali l'8.005 corrisponde a 8.01). Per alcuni valori dovuti ai capricci della matematica in virgola mobile, vengono invece arrotondati per difetto!

cioè

>>> round(1.0005,3) 
1.0 
>>> round(2.0005,3) 
2.001 
>>> round(3.0005,3) 
3.001 
>>> round(4.0005,3) 
4.0 
>>> round(1.005,2) 
1.0 
>>> round(5.005,2) 
5.0 
>>> round(6.005,2) 
6.0 
>>> round(7.005,2) 
7.0 
>>> round(3.005,2) 
3.0 
>>> round(8.005,2) 
8.01 

strano.

Supponendo che il vostro intento è quello di fare l'arrotondamento tradizionale per le statistiche nel campo delle scienze, questo è un wrapper a portata di mano per ottenere la funzione round funziona come previsto la necessità di import roba extra come Decimal.

>>> round(0.075,2) 

0.07 

>>> round(0.075+10**(-2*5),2) 

0.08 

Aha! Quindi, sulla base di questo siamo in grado di fare una funzione di ...

def roundTraditional(val,digits): 
    return round(val+10**(-len(str(val))-1)) 

Fondamentalmente questo aggiunge un valore garantito di essere più piccolo del minimo data cifra della stringa che stai cercando di utilizzare round su. Aggiungendo questa piccola quantità il comportamento di round nella maggior parte dei casi è preservato, mentre ora si assicura se la cifra inferiore a quella arrotondata a è 5 che arrotonda, e se è 4 si arrotonda.

L'approccio dell'utilizzo di 10**(-len(val)-1) è stato intenzionale, in quanto è il numero più piccolo che è possibile aggiungere per forzare lo spostamento, garantendo inoltre che il valore aggiunto non cambierà mai l'arrotondamento anche se manca il decimale .. Potrei usare solo 10**(-len(val)) con un if (val>1) condizionale per sottrarre 1 di più ... ma è più semplice sottrarre sempre il valore 1 in quanto ciò non cambierà molto l'intervallo applicabile di numeri decimali che questa soluzione può gestire correttamente. Questo approccio fallirà se i tuoi valori raggiungono i limiti del tipo, questo fallirà, ma per quasi l'intero intervallo di valori decimali validi dovrebbe funzionare.

È anche possibile utilizzare la libreria decimal per eseguire questa operazione, ma il wrapper che propongo è più semplice e può essere preferito in alcuni casi.


Edit: Grazie Blckknght per aver ricordato che il caso 5 frangia si verifica solo per certi valori. Anche una versione precedente di questa risposta non era sufficientemente esplicita che il comportamento di arrotondamento dispari si verifica solo quando la cifra immediatamente inferiore alla cifra a cui si sta arrotondando ha un 5.

+0

Non sono sicuro del perché pensi che i decimali con '5' come loro l'ultima cifra sarà sempre arrotondata, non è il caso di un test rapido che ho appena fatto con il numero s come '1.5',' 2.5', '3.5' e così via e' 1.05', '1.15',' 1.25', '1.35' arrotondando a una cifra decimale. Il primo set (la metà esatta arrotondata ai numeri interi piccoli) sempre arrotondata ad un intero pari. Quest'ultimo set non viene arrotondato in modo coerente, probabilmente a causa di rappresentazioni binarie inesatte di alcuni valori. I float con esatte rappresentazioni binarie come '1.25' round per avere una cifra ancora meno significativa, ma gli altri sembrano girare a caso. – Blckknght

+0

Interessante ... hai ragione. 'round (4.0005,3)' dà '4.0' e' round (1.0005,3) 'dà' 1.0', ma 'round (2.0005,3)' dà '2.001' e' round (3.0005,3) 'dà' 3.001'. Ma è proprio questo il motivo per cui la mia soluzione proposta è necessaria ... non sai cosa aspettarti dal round azionario, su questo caso significativo! –

+0

Grazie per questo. La tua funzione tornerà utile quando si presenterà questo problema. – TMWP

5

per i positivi, provare

int(x + 0.5) 

Per farlo funzionare per i negativi anche, provare

int(x + (0.5 if x > 0 else -0.5)) 

int() funziona come un fl oor funzione e quindi è possibile sfruttare questa proprietà. Questo è sicuramente il modo più veloce.

+3

non funziona per i negativi '>>> x = -0.999' ' >>> int (x), round (x), int (x + 0.5) ' ' (0, -1.0, 0) ' – user2907934

0

Se è necessario (ad esempio) un'approssimazione di due cifre per A, quindi int(A*100+0.5)/100.0 farà ciò che si sta cercando.

Se è necessaria l'approssimazione a tre cifre, moltiplicare e dividere per 1000 e così via.

1

È anche possibile utilizzare NumPy assumendo se si utilizza python3.x Ecco un esempio

import numpy as np 
x = 2.3 
print(np.rint(x)) 
>>> 2.0 
+0

https://github.com/rbgirshick/py-faster-rcnn/issues/481 –

Problemi correlati