int(round(x))
Lo arrotonderà e lo cambierà in numero intero
MODIFICARE:
Non stai assegnando int (round (h)) a nessuna variabile. Quando si chiama int (round (h)), restituisce il numero intero ma non fa altro; devi cambiare quella riga per:
h = int(round(h))
Per assegnare il nuovo valore a h
MODIFICA 2:
Come ha detto @plowman nei commenti, Python's round()non funziona come ci si aspetterebbe, ed è perché il modo in cui il numero viene memorizzato come variabile di solito non è il modo in cui lo vedi sullo schermo. Esistono molte risposte che spiegano questo comportamento:
round () non sembra arrotondare correttamente
Un modo per evitare questo problema è utilizzare il decimale come indicato da questa risposta: https://stackoverflow.com/a/15398691/4345659
Affinché questa risposta funzioni correttamente senza utilizzare librerie aggiuntive, sarebbe opportuno utilizzare una funzione di arrotondamento personalizzata. Dopo molte correzioni, ho trovato la seguente soluzione, che per quanto ho testato ha evitato tutti i problemi di archiviazione. Si basa sull'utilizzo della rappresentazione di stringhe, ottenuta con repr()(NOT str()!). Sembra confuso ma è stato l'unico modo che ho trovato per risolvere tutti i casi. Funziona con Python2 e Python3.
def proper_round(num, dec=0):
num = str(num)[:str(num).index('.')+dec+2]
if num[-1]>='5':
return float(num[:-2-(not dec)]+str(int(num[-2-(not dec)])+1))
return float(num[:-1])
test:
>>> print(proper_round(1.0005,3))
1.001
>>> print(proper_round(2.0005,3))
2.001
>>> print(proper_round(3.0005,3))
3.001
>>> print(proper_round(4.0005,3))
4.001
>>> print(proper_round(5.0005,3))
5.001
>>> print(proper_round(1.005,2))
1.01
>>> print(proper_round(2.005,2))
2.01
>>> print(proper_round(3.005,2))
3.01
>>> print(proper_round(4.005,2))
4.01
>>> print(proper_round(5.005,2))
5.01
>>> print(proper_round(1.05,1))
1.1
>>> print(proper_round(2.05,1))
2.1
>>> print(proper_round(3.05,1))
3.1
>>> print(proper_round(4.05,1))
4.1
>>> print(proper_round(5.05,1))
5.1
>>> print(proper_round(1.5))
2.0
>>> print(proper_round(2.5))
3.0
>>> print(proper_round(3.5))
4.0
>>> print(proper_round(4.5))
5.0
>>> print(proper_round(5.5))
6.0
>>>
>>> print(proper_round(1.000499999999,3))
1.0
>>> print(proper_round(2.000499999999,3))
2.0
>>> print(proper_round(3.000499999999,3))
3.0
>>> print(proper_round(4.000499999999,3))
4.0
>>> print(proper_round(5.000499999999,3))
5.0
>>> print(proper_round(1.00499999999,2))
1.0
>>> print(proper_round(2.00499999999,2))
2.0
>>> print(proper_round(3.00499999999,2))
3.0
>>> print(proper_round(4.00499999999,2))
4.0
>>> print(proper_round(5.00499999999,2))
5.0
>>> print(proper_round(1.0499999999,1))
1.0
>>> print(proper_round(2.0499999999,1))
2.0
>>> print(proper_round(3.0499999999,1))
3.0
>>> print(proper_round(4.0499999999,1))
4.0
>>> print(proper_round(5.0499999999,1))
5.0
>>> print(proper_round(1.499999999))
1.0
>>> print(proper_round(2.499999999))
2.0
>>> print(proper_round(3.499999999))
3.0
>>> print(proper_round(4.499999999))
4.0
>>> print(proper_round(5.499999999))
5.0
Infine, la risposta corretta sarebbe:
# Having proper_round defined as previously stated
h = int(proper_round(h))
EDIT 3:
test:
>>> proper_round(6.39764125, 2)
6.31 # should be 6.4
>>> proper_round(6.9764125, 1)
6.1 # should be 7
Il gotcha qui è che il decdecimo decimale può essere 9 e se la dec+1decima cifra> = 5 il 9 diventerà uno 0 e un 1 dovrebbe essere portato alla dec-1decima cifra.
Se lo prendiamo in considerazione, otteniamo:
def proper_round(num, dec=0):
num = str(num)[:str(num).index('.')+dec+2]
if num[-1]>='5':
a = num[:-2-(not dec)] # integer part
b = int(num[-2-(not dec)])+1 # decimal part
return float(a)+b**(-dec+1) if a and b == 10 else float(a+str(b))
return float(num[:-1])
Nella situazione sopra descritta b = 10e la versione precedente si concatenerebbe ae bciò comporterebbe una concatenazione di 10dove scomparire lo 0 finale. Questa versione si trasforma bnella giusta cifra decimale basata su dec, come carry corretto.
int(x)