Probleme arrondissement

Probleme arrondissement - SQL/NoSQL - Programmation

Marsh Posté le 12-07-2006 à 23:06:27    

J'ai un probleme d'arrondissement en sql et j'aimerait bien que vous m'aider. Voici en gros la requete tres simplifier:
 
Select round(100.555,2) from ........
 
Le resultat me donne 100.55 alors que je veut qui me donne 100.56. Si j'arrondit 100.556, il me donne bien 100.56 Selon moi, ca doit une setting dans les options regional ou un truc du genre qui dit que le chiffre 5 est arrondit a un chiffre inférieur. C'est une requete que je fait avec microsoft Sql server 2000 si ca peut aider. Merci

Reply

Marsh Posté le 12-07-2006 à 23:06:27   

Reply

Marsh Posté le 13-07-2006 à 00:04:41    

C'est une requete en visual basic que je fait et j'air remarquer cela dans plsuieur programme que l'arrondissement est different selon les logiciels
 
En excel, si je format une cellule qui contient 1.55 avec une décimal, il me donne 1.6  
En VB, si j'arrondit 1.55 avec une décimal, il me donne 1.6
Une requete SQL, si j'arrondit 1.55 avec une décimal, il me donne 1.5
 
 
Pour le moment j'ai trouver une astuce qui fonctionne :
 
select round(100.555+0.001,2) from .....
 
 
Mais je veut savoir de toute facons si c'est une option quelque part qui permet de decider comment il doit arrondir. Je veut pas deplacer mon programme sur un autre ordinateur que la requete me donne un résultat différent

Reply

Marsh Posté le 13-07-2006 à 15:47:44    

En fait mon astuce fonctionne pas parce que j'ai trouver un bug dans la fonction round() alors je sait pas trop quoi faire :sweat:  
 
Pour venir a bout de mon raissonement que la fonction round() est buggé, voici le résultat de mes recherches
 
round(602.505,2) = 602.50 alors que ca devrait etre 602.51
round(602.515,2) = 602.52
round(602.525,2) = 602.52 alors que ca devrait etre 602.53
round(602.535,2) = 602.54  
round(602.545,2) = 602.54 alors que ca devrait etre 602.55
round(602.555,2) = 602.55 alors que ca devrait etre 602.56
round(602.565,2) = 602.57  
round(602.575,2) = 602.58
round(602.585,2) = 602.58 alors que ca devrait etre 602.59
round(602.595,2) = 602.60  
 
Je sait pas trop comment faire pour me sortir de ce probleme. C'est directement dans visual basic que j'ai fait mes tests


Message édité par elecman le 13-07-2006 à 15:55:38
Reply

Marsh Posté le 16-07-2006 à 19:59:13    

Bon je voit que personne peut m'aider ^^


---------------
Perso FFXI : Buldom Galka MNK75/WAR75/NIN75/SMN75/DRG75/SAM75/DRK75/THF75
Reply

Marsh Posté le 16-07-2006 à 20:20:09    

moi j'ai appris en Maths que ,5 c'est arrondi au niveau inférieur :-)
je pense que les bases de données sont configurées en Dur de cette façon
 
edit: ce que tu peux faire c'est rajouter 0.0001 à ta valeur avant de faire un round ?
 
du style
 
SELECT round(table.valeur+0.0001) FROM ... WHERE ...


Message édité par dapp le 16-07-2006 à 20:21:08
Reply

Marsh Posté le 16-07-2006 à 23:07:10    

Les fonctions floor et ceil doivent faire ce que tu demandes.

Reply

Marsh Posté le 17-07-2006 à 10:42:54    

elecman a écrit :

J'ai un probleme d'arrondissement en sql et j'aimerait bien que vous m'aider. Voici en gros la requete tres simplifier:
 
Select round(100.555,2) from ........
 
Le resultat me donne 100.55 alors que je veut qui me donne 100.56. Si j'arrondit 100.556, il me donne bien 100.56 Selon moi, ca doit une setting dans les options regional ou un truc du genre qui dit que le chiffre 5 est arrondit a un chiffre inférieur. C'est une requete que je fait avec microsoft Sql server 2000 si ca peut aider. Merci


c'est pas dans les settings.
 
gros edit (sorry, je réfléchis et teste avant de poster la prochaine fois)
 
les round() et autres font l'objet de conventions. par conséquent, il n'y a pas de modification de leur comportement possible dans les settings.
ils auront systématiquement le même fonctionnement, quelque soit le langage, la plateforme et la langue utilisée.
 
Dans un script VBS, j'ai fait ça :
 

Code :
  1. msgbox(round(1.5, 0))
  2. msgbox(cint(1.5))
  3. msgbox(int(1.5))


 
J'obtiens 2, 2 et 1.
 
=> Le CInt() semble faire ce que tu veux.
=> Pour les arrondis à l'entier près, le round() aussi.
=> Le int() ne garde que la partie entière (comme le floor pour les nombres positifs, et comme le ceil pour les nombres négatifs logiquement)
 

Code :
  1. msgbox(round(1.55, 1))
  2. msgbox(cint(1.55 * 10) / 10)


 
Idem, j'ai 1.6 deux fois.
Round semble donc donner le bon résultat. Me demande si t'as pas rêvé, logiquement ça devrait être pareil entre SQL Server et VBS [:anathema]  
 
Dans tous les cas, CInt() donne le bon résultat. Donc tente de faire avec lui.


Message édité par Arjuna le 17-07-2006 à 11:08:18
Reply

Marsh Posté le 17-07-2006 à 10:58:32    

-- ouais, nan, j'ai rien dit. cf. le post modifié ci-dessus --


Message édité par Arjuna le 17-07-2006 à 11:08:46
Reply

Marsh Posté le 17-07-2006 à 11:41:24    

Je maintiens le floor et le ceil qui ont l'avantage de découler de définitions et non de conventions.

Reply

Marsh Posté le 17-07-2006 à 11:49:53    

ouais, mais c'est un peu plus chiant à utiliser... parceque virer la partie entière, checker que le résultat est >= à .5 et ensuite utiliser la bonne fonction, c'est un peu le marteau pillon pour pas grand chose. surtout dans une requête SQL, où la syntaxe est légèrement limitée...
 
ceci dit, rien ne l'empêche de faire une fonction PL contenant tout ce bordel, et ensuite utiliser sa fonction PL pour faire ce qu'il veut...

Reply

Marsh Posté le 17-07-2006 à 11:49:53   

Reply

Marsh Posté le 17-07-2006 à 11:52:16    

elecman > tiens au fait... tes nombres là, ils sont en "float" ou en "number" ?
 
parceque float a une précision complètement pourrie (c'est pareil dans tous les langages).
 
donc 1.5, est généralement représenté réellement comme 1.4999999997, ce qui s'arrondi effectivement à l'inférieur.
 
si tu veux des arrondis qui fonctionnent correctement, utilise un type qui a une précision fixe. le type "decimal (ou numeric, ce sont des alias)" est ton ami.

Reply

Marsh Posté le 17-07-2006 à 11:55:07    

oui désolé, j'étais focalisé sur le .5 à arrondir au dessus ou en dessous, en oubliant le reste  :)

Reply

Marsh Posté le 19-07-2006 à 22:42:20    

certain m'ont dit cela aussi, de ne pas utiliser float, que c'etait pas une bon type a utiliser. Merci de vos reponse

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed