Cours de Python / Calculer avec int, float et Decimal : opérations et conversions

En Python, int représente les entiers et float les nombres à virgule flottante binaire. Pour des montants soumis à des règles décimales exactes, choisissez des unités entières ou Decimal, en précisant l’unité et la règle d’arrondi : un float ne représente pas exactement toutes les fractions décimales.

Interpréter les opérateurs numériques

Expression Opération Résultat
7 / 2 Division 3.5
7 // 2 Division avec arrondi vers le bas 3
7 % 2 Reste de la division entière 1
2 ** 3 Puissance 8

L’arrondi de // se fait vers moins l’infini, et non vers zéro : -7 // 2 vaut -4, alors que int(-3.5) vaut -3. Avec des nombres négatifs, confondre ces deux opérations change le résultat. Des parenthèses permettent de rendre l’ordre des calculs explicite lorsque leur priorité n’est pas évidente.

Les entiers Python ne sont pas limités à une plage fixe de 32 bits ; la mémoire disponible limite néanmoins les calculs réalisables. La référence des types numériques précise le comportement des opérations et des conversions.

Exécuter une comparaison complète

Python 3 et sa bibliothèque standard suffisent ; aucun paquet supplémentaire n’est nécessaire. Créez un dossier d’exercice, puis enregistrez tout le code suivant dans numeric_demo.py, en UTF-8. Dans un terminal ouvert dans ce dossier avec votre environnement virtuel activé, lancez python numeric_demo.py. Sur macOS ou Ubuntu hors environnement virtuel, utilisez python3 si c’est le nom de votre interpréteur.

from decimal import Decimal

print(7 / 2, 7 // 2, 7 % 2)
print(-7 // 2, int(-3.5))
print(0.1 + 0.2 == 0.3)
print(Decimal("0.1") + Decimal("0.2"))
price_won = 3500
print(price_won * 3)

La sortie attendue est :

3.5 3 1
-4 -3
False
0.3
10500

La première ligne compare les trois opérations sur 7 et 2. La deuxième distingue l’arrondi vers le bas de la troncature. La troisième affiche False, car les approximations binaires utilisées par le calcul ne donnent pas exactement la valeur comparée. La quatrième calcule une somme décimale à partir de chaînes. La dernière multiplie un prix entier en wons par trois : aucune conversion de monnaie n’a lieu.

Si le fichier est introuvable, vérifiez le dossier du terminal et le nom réel du fichier, notamment une éventuelle extension supplémentaire .txt. Si l’interpréteur n’est pas celui du projet, vérifiez l’environnement choisi avant de modifier le programme.

Distinguer conversion, valeur stockée et affichage

int("3500") convertit une chaîne représentant un entier. int("3.5") lève une ValueError : cette chaîne n’a pas le format d’un entier. En revanche, int(3.5) reçoit déjà un nombre et tronque sa partie fractionnaire. float("3.5") produit un nombre flottant. Ne choisissez pas une conversion qui perd une fraction sans avoir décidé que cette perte est acceptable.

Afficher moins de décimales ne rend pas le calcul exact. format(0.1 + 0.2, ".2f") fournit la chaîne "0.30", mais ne transforme pas la valeur stockée en arithmétique décimale exacte. La présentation des limites des nombres flottants explique pourquoi cette différence est normale.

La frontière entre texte saisi et donnée numérique doit rester explicite. L’exemple de saisie avec input et de conversion d’une dépense permet de repérer cette frontière. Avant de retirer des caractères d’une saisie, définissez les formats réellement acceptés ; une virgule peut être un séparateur décimal ou un séparateur de milliers selon la convention choisie.

Choisir des unités entières ou Decimal

Pour un prix de 3500 wons sans fraction de won, un entier est simple à multiplier et à additionner. Pour une autre monnaie, vous pouvez aussi choisir une unité mineure entière, à condition de la définir clairement. Le programme doit savoir si 3500 signifie des unités monétaires ou leurs centièmes.

Decimal est un type de la bibliothèque standard conçu pour les calculs décimaux. Construisez les valeurs à partir de chaînes, par exemple Decimal("0.1"). Avec Decimal(0.1), vous transmettez une approximation flottante déjà créée ; le constructeur ne retrouve pas automatiquement la valeur décimale que vous aviez en tête.

Les calculs Decimal ont eux aussi un contexte de précision et d’arrondi. La documentation du module decimal décrit ces réglages. Choisissez-les selon les règles du calcul : le type ne décide pas à votre place du moment où arrondir ni de la manière de partager un montant qui ne se divise pas exactement.

Comparer les cas limites et restaurer l’exemple

  1. Dans une copie du fichier, remplacez seulement -7 // 2 par -7 / 2. La deuxième ligne commence alors par -3.5 au lieu de -4. Rétablissez // pour retrouver la sortie initiale.
  2. Remplacez le diviseur de 7 / 2 par zéro. Python lève une ZeroDivisionError et s’arrête à cette instruction : les lignes suivantes ne s’exécutent pas. Remettez le diviseur 2 avant le test suivant.
  3. Essayez séparément int("3500 KRW"). La conversion lève une ValueError, car l’unité fait partie du texte. Revenez à int("3500") pour vérifier la conversion d’une valeur conforme.
  4. Remplacez seulement price_won = 3500 par price_won = 4000. La dernière ligne devient 12000. Rétablissez 3500 et relancez le fichier complet pour retrouver 10500.

Ces comparaisons vérifient des règles différentes : sens de la division, entrée invalide, division impossible et choix de l’unité. Conserver une copie du fichier initial permet de revenir à un exemple connu sans masquer l’erreur en remplaçant silencieusement une saisie invalide par zéro.