Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1182 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Probleme arrondissement

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme arrondissement

n°1405954
elecman
Posté le 12-07-2006 à 23:06:27  profilanswer
 

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

mood
Publicité
Posté le 12-07-2006 à 23:06:27  profilanswer
 

n°1405998
elecman
Posté le 13-07-2006 à 00:04:41  profilanswer
 

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

n°1406463
elecman
Posté le 13-07-2006 à 15:47:44  profilanswer
 

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
n°1407701
elecman
Posté le 16-07-2006 à 19:59:13  profilanswer
 

Bon je voit que personne peut m'aider ^^


---------------
Perso FFXI : Buldom Galka MNK75/WAR75/NIN75/SMN75/DRG75/SAM75/DRK75/THF75
n°1407708
dapp
papango
Posté le 16-07-2006 à 20:20:09  profilanswer
 

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
n°1407766
GrosBocdel
Posté le 16-07-2006 à 23:07:10  profilanswer
 

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

n°1407882
Arjuna
Aircraft Ident.: F-MBSD
Posté le 17-07-2006 à 10:42:54  profilanswer
 

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
n°1407894
Arjuna
Aircraft Ident.: F-MBSD
Posté le 17-07-2006 à 10:58:32  profilanswer
 

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


Message édité par Arjuna le 17-07-2006 à 11:08:46
n°1407953
GrosBocdel
Posté le 17-07-2006 à 11:41:24  profilanswer
 

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

n°1407963
Arjuna
Aircraft Ident.: F-MBSD
Posté le 17-07-2006 à 11:49:53  profilanswer
 

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

mood
Publicité
Posté le 17-07-2006 à 11:49:53  profilanswer
 

n°1407968
Arjuna
Aircraft Ident.: F-MBSD
Posté le 17-07-2006 à 11:52:16  profilanswer
 

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.

n°1407974
GrosBocdel
Posté le 17-07-2006 à 11:55:07  profilanswer
 

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

n°1409795
elecman
Posté le 19-07-2006 à 22:42:20  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Probleme arrondissement

 

Sujets relatifs
problème : mktime et dateProblème passge MFC / Non MFC
Bloc - lien en a href/ problème de certification w3c[rèsolu]probleme machine virtuelle
Problème fichiers temporaires[VB.NET et C#.Net] Problème de tableau /click bouton (postback?)
[Résolu]Problème de CSS avec Firefoxprobleme avec jointure sur 3 tables
problème session registerprobleme de modelisation
Plus de sujets relatifs à : Probleme arrondissement


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR