

Python peut très bien servir de calculatrice, notamment directement dans son interpréteur interactif. Et contrairement à une calculatrice classique qui affiche souvent des valeurs décimales approchées, Python sait aussi travailler avec des fractions exactes.
Pour cela, la bibliothèque standard fournit le module fractions et sa classe Fraction. Aucun paquet supplémentaire n’est donc à installer.
Calculer exactement avec des fractions en Python
On peut importer Fraction directement. Pour éviter de retaper son nom à chaque calcul, j’aime bien lui donner un alias très court :
from fractions import Fraction as f
On peut ensuite écrire les fractions presque aussi naturellement que sur une calculatrice :
>>> f(1, 3) + f(1, 6)
Fraction(1, 2)
>>> f(2, 5) * f(3, 4)
Fraction(3, 10)
>>> f(2, 3) ** 2
Fraction(4, 9)
Addition, soustraction, multiplication, division, puissances… les opérations classiques sont disponibles et le résultat est automatiquement donné sous forme d’une fraction irréductible.
Par exemple :
>>> f(18, 24)
Fraction(3, 4)
Python s’est chargé tout seul de simplifier la fraction.
Attention au piège des nombres décimaux
Il y a cependant une subtilité importante lorsqu’on mélange fractions et nombres décimaux.
Ces deux écritures ne donnent pas exactement le même résultat :
>>> f(1, 10)
Fraction(1, 10)
>>> f(0.1)
Fraction(3602879701896397, 36028797018963968)
Pourquoi cette énorme fraction ? Parce que 0.1 est d’abord représenté par Python sous la forme d’un nombre flottant binaire. Or un dixième ne possède pas de représentation binaire finie exacte.
Si l’on veut construire exactement la fraction correspondant à l’écriture décimale 0.1, on peut utiliser une chaîne de caractères :
>>> f("0.1")
Fraction(1, 10)
Cette petite différence est particulièrement intéressante pour comprendre pourquoi le calcul avec des nombres flottants peut parfois produire des résultats surprenants.
Retrouver une fraction simple avec limit_denominator()
La méthode limit_denominator() permet aussi de rechercher une fraction simple approchant un nombre donné.
>>> f(0.1).limit_denominator()
Fraction(1, 10)
Elle peut être très pratique lorsqu’un calcul fournit une valeur décimale et que l’on soupçonne qu’une fraction simple se cache derrière.
Par exemple :
>>> f(3.141592653589793).limit_denominator(100)
Fraction(311, 99)
Le nombre donné à limit_denominator() fixe ici le dénominateur maximal autorisé.
Récupérer le numérateur et le dénominateur
Une Fraction n’est pas seulement une jolie façon d’afficher un résultat. On peut également récupérer directement son numérateur et son dénominateur.
>>> x = f(18, 24)
>>> x
Fraction(3, 4)
>>> x.numerator
3
>>> x.denominator
4
Ces deux attributs correspondent à la fraction une fois celle-ci simplifiée.
Une petite classe bien pratique
Pour quelques calculs rapides, pour travailler sur les nombres rationnels ou simplement pour éviter les approximations décimales, Fraction est donc un outil Python particulièrement pratique.
Et comme il appartient à la bibliothèque standard, une seule ligne suffit pour commencer :
from fractions import Fraction as f
Pour aller plus loin, on peut consulter la documentation officielle du module fractions.