Round et Mysql :D

WRInaute impliqué
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:
 
WRInaute passionné
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:
 
WRInaute impliqué
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.
 
WRInaute impliqué
Je ne peux pas, j'effectue un Round sur une division entre les champs de ma table et j'ai des milliers d'enregistrements :)
 
WRInaute impliqué
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 ?
 
WRInaute passionné
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 ?
 
WRInaute impliqué
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 ^^
 
Discussions similaires
Haut