Les quatre types numériques
Le BSON propose :
| Type BSON | Usage |
|---|---|
double | flottant 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 |
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
double peuvent accumuler des erreurs d'arrondi (des fractions de centime). À éviter pour de la facturation.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)
})
bsonType: "int".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") } ]
})
NumberDecimal("1.02") pour éviter toute conversion par un double intermédiaire.La correspondance côté Java
Les types MongoDB se retrouvent dans l'API Spring :
| BSON | Java |
|---|---|
int | int / Integer |
long | long / Long |
double | double / Double |
decimal128 | java.math.BigDecimal |
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.En résumé
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.
- 4 types :
double,int,long,decimal128. - Dans mongosh, un nombre est un
doublepar défaut : attention aux arrondis. - Entiers :
NumberInt/NumberLong; argent :NumberDecimal("…"). - Correspondance :
decimal128↔BigDecimalen Java.