🛢️Parcours Fioul GroupéMongoDB · Chapitre 16
Accueil › MongoDB › Chapitre 16
Chapitre 16 / 17

Les types de nombre

Le BSON distingue plusieurs types numériques : entiers 32 et 64 bits, décimaux flottants, et un décimal exact. Choisir le bon type évite des surprises — surtout quand on manipule de l'argent, comme le prix du fioul.

1 Notion

Les quatre types numériques

Le BSON propose :

Type BSONUsage
doubleflottant 64 bits (par défaut dans mongosh)
int (int32)entier 32 bits (jusqu'à ~2,1 milliards)
long (int64)entier 64 bits (très grands entiers)
decimal (decimal128)décimal exact — pour l'argent
2 Piège

Le piège du double par défaut

Dans mongosh, tout nombre écrit simplement est un double. Or les double ne représentent pas exactement certaines décimales : 0.1 + 0.2 ne fait pas exactement 0.3. Gênant pour des prix.

db.test.insertOne({ prix: 1.02 })   // prix est un double
Conséquence — des calculs de prix en double peuvent accumuler des erreurs d'arrondi (des fractions de centime). À éviter pour de la facturation.
3 Pratique

Forcer un entier

Pour stocker un vrai entier (des litres, un compteur), on utilise NumberInt() (int32) ou NumberLong() (int64).

db.campagnes.insertOne({
  zone: "Ladignac-le-Long",
  litresCibles: NumberInt(8000)
})
Pourquoi — c'est plus compact, plus clair sémantiquement, et cela permet à la validation de schéma d'exiger bsonType: "int".
4 Pratique

decimal128 pour l'argent

NumberDecimal() stocke un décimal exact (128 bits). C'est LE type à utiliser pour un prix, un montant, une somme d'argent.

db.fournisseurs.insertOne({
  nom: "TotalEnergies",
  paliers: [ { volumeMin: NumberInt(3000),
               prixLitre: NumberDecimal("1.02") } ]
})
À noter — on passe la valeur en chaîne à NumberDecimal("1.02") pour éviter toute conversion par un double intermédiaire.
5 Lien

La correspondance côté Java

Les types MongoDB se retrouvent dans l'API Spring :

BSONJava
intint / Integer
longlong / Long
doubledouble / Double
decimal128java.math.BigDecimal
Cohérence — un prixLitre stocké en decimal128 se mappe en BigDecimal dans l'entité Spring : la précision monétaire est préservée de bout en bout.
6 Bilan

En résumé

🛢️ Sur le projet Fioul Groupé

Règle simple pour le projet : litres en NumberInt, prix et montants en NumberDecimal (jamais en double). Côté Spring, prixLitre devient un BigDecimal. Tu évites ainsi les erreurs d'arrondi sur les factures de commande groupée.

Ce qu'il faut retenir du chapitre
  • 4 types : double, int, long, decimal128.
  • Dans mongosh, un nombre est un double par défaut : attention aux arrondis.
  • Entiers : NumberInt/NumberLong ; argent : NumberDecimal("…").
  • Correspondance : decimal128 ↔ BigDecimal en Java.
← Chapitre 15