Skip to content

Arrondir après le point décimal en Python (math.floor, ceil)

En Python, vous pouvez arrondir vers le bas et vers le haut un nombre flottant flottant avec math.floor() et math.ceil().

Cet article décrit le contenu suivant.

  • Arrondir à l’inférieur (= prendre la parole) :math.floor()
  • Arrondir (= prendre le plafond) :math.ceil()
  • Différence entre math.floor() et int()
  • Arrondi vers l’infini

Notez que math.floor() arrondit vers l’infini négatif et math.ceil() arrondit vers l’infini positif. Soyez prudent lorsque vous manipulez des valeurs négatives.

Les résultats sont résumés comme suit. Vous pouvez utiliser int() pour arrondir vers zéro (= tronquer, arrondir à partir de l’infini), mais vous devez définir une fonction pour arrondir vers l’infini. Les détails sont décrits plus tard.

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

Vous pouvez utiliser round() pour arrondir la moitié à pair.

Si vous souhaitez arrondir vers le haut et vers le bas les éléments d’un ndarray de tableau NumPy, consultez l’article suivant.

Arrondir à l’inférieur (= prendre la parole) :math.floor()

Utilisez math.floor() pour arrondir. Un entier int est renvoyé.

import math

print(math.floor(10.123))
# 10

print(math.floor(10.987))
# 10

print(type(math.floor(10.123)))
# <class 'int'>

Dans le cas d’un entier int, la valeur est renvoyée telle quelle. Une erreur est levée dans le cas d’un objet d’une classe sans la méthode spéciale __floor__(), comme une chaîne 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) renvoie le plancher de x, le plus grand entier inférieur ou égal à x. C’est-à-dire qu’il arrondit à l’infini négatif.

Pour les valeurs négatives, les résultats sont les suivants.

print(math.floor(-10.123))
# -11

print(math.floor(-10.987))
# -11

Si vous voulez tronquer les valeurs absolues sans changer le signe, c’est-à-dire arrondir vers zéro, utilisez int() décrit ci-dessous.

Arrondir (= prendre le plafond) :math.ceil()

Utilisez math.ceil() pour arrondir. Un entier int est renvoyé.

print(math.ceil(10.123))
# 11

print(math.ceil(10.987))
# 11

print(type(math.ceil(10.123)))
# <class 'int'>

Dans le cas d’un entier int, la valeur est renvoyée telle quelle. Une erreur est levée dans le cas d’un objet d’une classe sans la méthode spéciale __ceil__(), comme une chaîne 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) renvoie le plafond de x, le plus petit entier supérieur ou égal à x. C’est-à-dire qu’il s’arrondit à l’infini positif.

Pour les valeurs négatives, les résultats sont les suivants.

print(math.ceil(-10.123))
# -10

print(math.ceil(-10.987))
# -10

Si vous souhaitez arrondir la valeur absolue sans changer de signe, c’est-à-dire arrondir vers l’infini, vous devez définir une nouvelle fonction. Les détails sont décrits ci-dessous.

Différence entre math.floor() et int()

Vous pouvez également utiliser int() pour arrondir.

int() renvoie le même résultat que math.floor() pour les valeurs positives.

print(int(10.123))
# 10

print(int(10.987))
# 10

print(int(10))
# 10

print(type(int(10.123)))
# <class 'int'>

Le résultat pour les valeurs négatives est différent de math.floor().

math.floor() arrondit à l’infini négatif, int() arrondit à zéro.

print(int(-10.123))
# -10

print(int(-10.987))
# -10

int() peut également convertir une chaîne str en un entier int.

Les chaînes représentant des nombres décimaux ne peuvent pas être converties, mais les chaînes en notation binaire ou hexadécimale peuvent être converties en spécifiant le deuxième paramètre, base.

print(int('10'))
# 10

# print(int('10.123'))
# ValueError: invalid literal for int() with base 10: '10.123'

print(int('FF', 16))
# 255

Arrondi vers l’infini

Lorsque des valeurs négatives sont prises en compte, il existe quatre types d’arrondi vers le haut et vers le bas.

Comme décrit ci-dessus, vous pouvez utiliser les fonctions suivantes.

  • Arrondi vers l’infini négatif :math.floor()
  • Arrondi vers l’infini positif :math.ceil()
  • Arrondi vers zéro :int()
  • Arrondi vers l’infini
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

Par exemple, vous pouvez définir une fonction qui arrondit vers l’infini comme suit.

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

La valeur absolue par abs() est arrondie par math.ceil() et renvoyée au même signe que la valeur d’origine par math.copysign(). Comme math.copysign() renvoie un nombre à virgule flottante float, il est converti en entier int par int().