Skip to content

Arrotondare per eccesso o per difetto dopo il punto decimale in Python (math.floor, ceil)

Python

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().