
In Python, puoi arrotondare per difetto e per eccesso un numero in virgola mobile float con math.floor() e math.ceil().
In questo articolo vengono descritti i seguenti contenuti.
- Arrotonda per difetto (= prendi la parola):
math.floor() - Arrotonda (= prendi il soffitto):
math.ceil() - Differenza tra math.floor() e int()
- Rotonda verso l’infinito
Nota che math.floor() arrotonda verso l’infinito negativo e math.ceil() arrotonda verso l’infinito positivo. Fai attenzione quando gestisci valori negativi.
I risultati sono riassunti come segue. È possibile utilizzare int() per arrotondare verso zero (= troncare, arrotondare per allontanamento dall’infinito), ma è necessario definire una funzione per arrotondare verso l’infinito. I dettagli sono descritti più avanti.
print(math.floor(10.123))
# 10
print(math.floor(-10.123))
# -11
print(math.ceil(10.123))
# 11
print(math.ceil(-10.123))
# -10
print(int(10.123))
# 10
print(int(-10.123))
# -10
Puoi usare round() per arrotondare metà a pari.
Se si desidera arrotondare per eccesso e per difetto gli elementi di un array NumPy ndarray, vedere il seguente articolo.
Arrotonda per difetto (= prendi la parola):math.floor()
Usa math.floor() per arrotondare per difetto. Viene restituito un intero int.
import math
print(math.floor(10.123))
# 10
print(math.floor(10.987))
# 10
print(type(math.floor(10.123)))
# <class 'int'>
Nel caso di un intero int, il valore viene restituito così com’è. Viene generato un errore nel caso di un oggetto di una classe senza il metodo speciale __floor__(), come una stringa str.
print(math.floor(10))
# 10
# print(math.floor('10'))
# TypeError: must be real number, not str
print(hasattr(10, '__floor__'))
# True
print(hasattr('10', '__floor__'))
# False
math.floor(x) richiede il floor di x, l’intero più grande minore o uguale a x. Cioè, arrotondato all’infinito negativo.
Per i valori negativi, i risultati sono i seguenti.
print(math.floor(-10.123))
# -11
print(math.floor(-10.987))
# -11
Se si desideratroncare i valori assoluti senza cambiare il segno, ovvero arrotondare verso zero, utilizzare int() segui di seguito.
Arrotonda (= prendi il soffitto):math.ceil()
Usa math.ceil() per arrotondare per eccesso. Viene restituito un intero int.
print(math.ceil(10.123))
# 11
print(math.ceil(10.987))
# 11
print(type(math.ceil(10.123)))
# <class 'int'>
Nel caso di un intero int, il valore viene restituito così com’è. Viene generato un errore nel caso di un oggetto di una classe senza il metodo speciale __ceil__(), come una stringa str.
print(math.ceil(10))
# 10
# print(math.ceil('10'))
# TypeError: must be real number, not str
print(hasattr(10, '__ceil__'))
# True
print(hasattr('10', '__ceil__'))
# False
math.ceil(x) produce il massimo limite di x, il più piccolo intero maggiore o uguale a x. Cioè, arrotondato all’infinito positivo.
Per i valori negativi, i risultati sono i seguenti.
print(math.ceil(-10.123))
# -10
print(math.ceil(-10.987))
# -10
Se si vuole arrotondare per eccesso il valore assoluto senza cambiare il segno, cioè per arrotondare all’infinito, è necessario definire una nuova funzione. I dettagli sono descritti di seguito.
Differenza tra math.floor() e int()
Puoi anche usare int() per arrotondare per difetto.
int() restituisce lo stesso risultato di math.floor() per valori positivi.
print(int(10.123))
# 10
print(int(10.987))
# 10
print(int(10))
# 10
print(type(int(10.123)))
# <class 'int'>
Il risultato per i valori negativi è diverso da math.floor().
math.floor() arrotonda a infinito negativo, int() arrotonda a zero.
print(int(-10.123))
# -10
print(int(-10.987))
# -10
int() può anche includere una stringa str in un int.
Le stringhe che rappresentano numeri decimali non possono essere convertite, ma le stringhe in notazione binaria o esadecimale possono essere convertite specificando il secondo parametro, base.
print(int('10'))
# 10
# print(int('10.123'))
# ValueError: invalid literal for int() with base 10: '10.123'
print(int('FF', 16))
# 255
Rotonda verso l’infinito
Quando si ottiene valori negativi, quattro esistono tipi di arrotondamento per eccesso e per difetto.
Come sopra descritto, è possibile utilizzare le seguenti funzioni.
- Arrotonda verso l’infinito negativo:
math.floor() - Arrotonda verso l’infinito positivo:
math.ceil() - Arrotonda verso zero:
int() - Rotonda verso l’infinito
print(math.floor(10.123))
# 10
print(math.floor(-10.123))
# -11
print(math.ceil(10.123))
# 11
print(math.ceil(-10.123))
# -10
print(int(10.123))
# 10
print(int(-10.123))
# -10
Ad esempio, puoi definire una funzione che arrotonda all’infinito come segue.
def round_towards_infinity(x):
return int(math.copysign(math.ceil(abs(x)), x))
print(round_towards_infinity(10.123))
# 11
print(round_towards_infinity(-10.123))
# -11
Il valore assoluto di abs() viene arrotondato per eccesso da math.ceil() e restituito con lo stesso segno del valore originale da math.copysign(). Poiché math.copysign() fornisce un numero a virgola mobile float, viene convertito in un intero int da int().
