[RESOLU] E-commerce - MariaDB - Quel type choisir pour sa colonne ?

Avatar du membre
Eléphant du PHP | 88 Messages

04 janv. 2019, 18:39

Bonjour.

Je viens demander conseil SVP : pour un E-commerce Quel type choisir pour sa colonne ? (j'utilise MariaDB 10.2 comme SGBDR)
Pour socker des prix, j'avais pour habitude d'utiliser Type decimal (10,2)

Mais après avoir fait des recherches "Floating Number Precision" dans Google, je me rend compte qu'on peut potentiellement avec des problèmes d'imprécision...

Par exemple, pour un produit qui vaux 35,20 €, certains disent qu'il faut stocker 3520 dans une colonne de type int, d'autres disent que stocker 35.20 dans une colonne de type decimal (10,2) .

D'autres disent que pour respecter la loi française il faut prévoir l'utilisation de 5 décimales pour les valeurs monétaires...

PS : quand en PHP je m'amuse à faire :

Code : Tout sélectionner

var_dump( 35.00 - 34.99 );
ça me retourne : float(0.009999999999998)

On peut toujours contourner ce problème avec un number_format($resultat, 2) ou avec un round($resultat, 2), mais bon... c'est pas très rassurant d'utiliser le type decimal (10,2)...
Mais si un jour plutôt que de stocker 2 chiffres après la virgule, ou souhaite en stocker 3 ou 4 ou autres, ça sera moins compliqué à faire si on a utilisé decimal (10,2) au lieu de int comme type dans la colonne de son SGBDR.

Que me conseillez-vous ?

Merci beaucoup.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

04 janv. 2019, 19:14

Pour le stockage dans ta BDD, il faut utiliser DECIMAL() qui stocke de façon précise la valeur.
Il n'y a pas de débat là dessus et c'est même indiqué dans la doc :
https://dev.mysql.com/doc/refman/5.7/en ... types.html
These types are used when it is important to preserve exact precision, for example with monetary data.
Le problème de calcul que tu observes ne vient pas des valeurs stockées en base, mais de ta manière de calculer en PHP en utilisant "simplement" le signe moins pour faire la soustraction.
L'encadré en rouge dans la doc sur le type de données float en PHP indique bien les limitations et donnes la solution :
http://php.net/manual/fr/language.types.float.php

:arrow: Si on veut éviter les approximations il faut utiliser les fonctions mathématiques de précisions
http://php.net/manual/fr/ref.bc.php
<?php
$a = 35.00;
$b = 34.99;

var_dump( $a - $b ); // 0.009999999999998

var_dump( bcsub($a, $b, 2) ); // 0.01
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphant du PHP | 88 Messages

04 janv. 2019, 21:42

Merci beaucoup !
Je n'ai jamais utilisé les fonctions mathématiques de précisions, je vais mi mettre.
Merci.