Round et Mysql :D

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


mowmow
WRInaute passionné
WRInaute passionné
 
Messages: 975
Inscription: Mer Nov 03, 2004 9:40

Round et Mysql :D

Message le Lun Fév 20, 2006 14:36

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:


Bourriquet
WRInaute passionné
WRInaute passionné
 
Messages: 635
Inscription: Lun Sep 19, 2005 22:10

Message le Lun Fév 20, 2006 14:46

Etrange.

Moi je n'ai pas ce bug.

Tu es sur quelle version de mysql ?


Bourriquet
WRInaute passionné
WRInaute passionné
 
Messages: 635
Inscription: Lun Sep 19, 2005 22:10

Message le Lun Fév 20, 2006 14:48

Pour simple vérification, tu as bien écrit :

'deux point cinq' et non pas 'deux virgule cinq'

?


mowmow
WRInaute passionné
WRInaute passionné
 
Messages: 975
Inscription: Mer Nov 03, 2004 9:40

Message le Lun Fév 20, 2006 15:55

Voui j'ai bien écris 2.5 :(

Version MySQL 4.0.25

spidetra
WRInaute accro
WRInaute accro
 
Messages: 1500
Inscription: Lun Juil 07, 2003 13:06

Message le Lun Fév 20, 2006 16:03

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:


Bourriquet
WRInaute passionné
WRInaute passionné
 
Messages: 635
Inscription: Lun Sep 19, 2005 22:10

Message le Lun Fév 20, 2006 16:04

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 écrit: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.


mowmow
WRInaute passionné
WRInaute passionné
 
Messages: 975
Inscription: Mer Nov 03, 2004 9:40

Message le Lun Fév 20, 2006 16:11

Hem, c'est assez embêtant :(

Comment utiliser une autre méthode que round ? o_o


Bourriquet
WRInaute passionné
WRInaute passionné
 
Messages: 635
Inscription: Lun Sep 19, 2005 22:10

Message le Lun Fév 20, 2006 16:31

Et si... Tu le faisais en PHP ton round ?


mowmow
WRInaute passionné
WRInaute passionné
 
Messages: 975
Inscription: Mer Nov 03, 2004 9:40

Message le Lun Fév 20, 2006 17:18

Je ne peux pas, j'effectue un Round sur une division entre les champs de ma table et j'ai des milliers d'enregistrements :)


Bourriquet
WRInaute passionné
WRInaute passionné
 
Messages: 635
Inscription: Lun Sep 19, 2005 22:10

Message le Lun Fév 20, 2006 22:19

Dans ce cas j'ai une solution :D

Code: Tout sélectionner
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 ?

spidetra
WRInaute accro
WRInaute accro
 
Messages: 1500
Inscription: Lun Juil 07, 2003 13:06

Message le Lun Fév 20, 2006 23:31

je viens de faire un test en mysql 5.1
Code: Tout sélectionner
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 ?


mowmow
WRInaute passionné
WRInaute passionné
 
Messages: 975
Inscription: Mer Nov 03, 2004 9:40

Message le Mer Fév 22, 2006 12:46

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 ^^


Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité