ADR-0018 — bcmath / brick/math pour le calcul monétaire
| Statut | Accepté |
|---|---|
| Date | 2025-09-05 |
| Auteurs | Julien Jorry |
Contexte
Le type float de PHP (IEEE 754) perd des centimes sur des additions répétées : 0.1 + 0.2 = 0.30000000000000004. Une MLCC ne peut pas se permettre la moindre perte ou création silencieuse de monnaie due à un arrondi flottant.
Décision
Tous les montants sont en BigDecimal (chaîne via brick/math ou bcmath) à travers les services. En base, colonnes DECIMAL(15,2). PHPStan refuse float sur toute variable nommée $amount*, $balance*, $montant*.
Conséquences positives
- Exactitude décimale garantie.
- Pas de perte / création silencieuse de centimes.
- Conformité comptable.
Conséquences négatives
- API un peu plus verbeuse (
BigDecimal::of('10.50')->plus($x)). - Pas de
+/*natif : utiliser les méthodes.
Alternatives examinées
- float — rejeté pour les raisons ci-dessus.
- int (centimes) — possible mais plus verbeux en sortie (formattage).