Round et Mysql :D

Salut tout le monde,

Voilà après "Rand et Mysql" je suis de retour avec notre ami Round ... :D

Tout simple comme problème :
Je voudrais arrondir les décimales d'un nombre de telle sorte à avoir :
1,4 = 1
1,5 = 2
1,67 = 2
2,42 = 2
2,5 = 3 .... etc

Cependant voilà le petit problème que je rencontre :
- SELECT ROUND(1.5) => 2
pas de problème jusque là

Mais si on fait ca :
- SELECT ROUND(2.5) => 2
Là ca coince, ROUND(2.5) devrait faire 3 °_o

Avec les chiffres impairs je n'ai aucun problème, mais avec les pairs, ROUND arrondit à l'unité inférieur pour une décimale égale à 0.5 !

Quelqu'un a une idée ? C'est un bug connu ? :(

Merci :oops:
 
The behavior of ROUND() when the argument is halfway between two integers depends on the C library implementation.
Different implementations round to the nearest even number, always up, always down, or always toward zero.

c'est pas rassurant :wink:
 
A priori c'est pas un bug de mysql, mais une conséquence de l'implémentation de certaines routines C qui fonctionnent différemment suivant l'os :

Manuel MySQL a dit:
The behavior of ROUND() when the argument is halfway between two integers depends on the C library implementation. Different implementations round to the nearest even number, always up, always down, or always toward zero. If you need one kind of rounding, you should use a well-defined function such as TRUNCATE() or FLOOR() instead.
 
Je ne peux pas, j'effectue un Round sur une division entre les champs de ma table et j'ai des milliers d'enregistrements :)
 
Dans ce cas j'ai une solution :D

Code:
SELECT ROUND(2.5 + 0.1)

Ca marche. Et comme 2.4 + 0.1 ça fait 2.5 et qu'il l'arrondit à l'entier inférieur, ça fait 2.

Si tu as 2 tout pile et que t'ajoute 0.1 puis que tu arrondis, tu retombes à 2.

Magique non ?
 
je viens de faire un test en mysql 5.1
Code:
mysql> SELECT ROUND(3.5), ROUND(3.5E-0), ROUND(35E-1), ROUND(2.5), ROUND(25E-1);

+------------+---------------+--------------+------------+--------------+
| ROUND(3.5) | ROUND(3.5E-0) | ROUND(35E-1) | ROUND(2.5) | ROUND(25E-1) |
+------------+---------------+--------------+------------+--------------+
|          4 |             3 |            3 |          3 |            2 |
+------------+---------------+--------------+------------+--------------+
1 row in set (0.00 sec)

mysql> SELECT ROUND((5/2));
+--------------+
| ROUND((5/2)) |
+--------------+
|            3 |
+--------------+
1 row in set (0.00 sec)

L'arrondit supérieur ou inférieur dépend aussi si tu as une valeur exacte ( 3.5 ) ou une valeur approchée ( 3.5E0 ou 35E-1).

Qu'est-ce que tu obtient si tu teste ces valeurs ?
 
J'obtiens ca :

ROUND(3.5) 4
ROUND(3.5E-0) 4
ROUND(35E-1) 4
ROUND(2.5) 2
ROUND(25E-1) 2
ROUND((5/2)) 2

Ca change pas grand chose à notre problème apparament :D

Bourriquet > D'accord pour 2.5, mais pour 3.5 le round fonctionne correctement donc là ca me fausse tout ^^
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut