Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/03/2011, 12h09   #1
Invité régulier
 
Inscription : décembre 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 40
Points : 8
Points : 8
Par défaut Problème de nombres scientifiques

Bonjour,

J'ai actuellement un problème. Je travail sur des nombres stockés dans une base, en deux parties : la partie alphanumérique du nombre d'un côté, et le nombre de décimales de l'autre.

Instinctivement, j'ai opté pour cette formule :
Code :
1
2
SELECT nombre / POWER(10, nb_decimales) 
FROM matable
Jusque là, tout va bien, sauf que j'alimente un fichier de sortie, donc je dois CASTer la donner en char :
Code :
1
2
SELECT CAST(nombre / POWER(10, nb_decimales) AS CHAR) 
FROM matable
Seulement, le problème est qu'il ne m'affiche plus les décimales à partir de la cinquième... (ex : 1 / 10000000 ==> 0.0000 au lieu de 0.00000001)

Du coup, je me dis que je dois une nouvelle fois CASTer pour convertir le tout en DECIMAL avec une précision convenable :
Code :
1
2
SELECT CAST(CAST(nombre / POWER(10, nb_decimales) AS DECIMAL(24,9)) AS CHAR) 
FROM matable
Un nouveau problème frappe alors: la sortie affiche les zéro non significatifs. Du coup, je me dis que je pourrais modifier la précision en mettant nb_decimales en tant que deuxième argument (DECIMAL(24,nb_decimales)), mais ça ne passe pas : erreur au lancement de la requête puisqu'une constante est attendue...

J'ai essayé une autre feinte en utilisant la fonction ROUND, mais dès que je remplace le nombre de décimale par nb_decimales, il m'affiche un nombre scientifique.
Code :
SELECT  CAST(ROUND(nombre / POWER(10, nb_decimales), nb_decimales) AS CHAR)
Bref, je suis en panne d'inspiration. Connaissez-vous une méthode où l'on puisse récupérer à coup sur un nombre au format alphanumérique issue d'une division, et qui ne soit pas affiché comme format scientifique ?
(ex : je veux 0.000001 à l'issue de la division 1 / 10^6 et non pas 1e-06)

Merci.
MrWeb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 14h15   #2
Invité régulier
 
Inscription : décembre 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 40
Points : 8
Points : 8
Pour info, j'ai trouvé ceci, qui ne marche pas trop mal. Je trouve ça triste d'en arriver jusque là

Code :
SELECT TRIM(TRAILING '.' FROM TRIM(TRAILING 0 FROM ROUND(nombre / POWER(10, nb_decimales), nb_max_decimales)))
MrWeb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2011, 14h53   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 998
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 998
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
J'ai du mal à comprendre ton problème.

Si je fais cette requête :
Code :
SELECT CAST( 1 / POWER( 10, 6  )  AS DECIMAL( 12, 6  )  )
MySQL m'affiche : 0.000001
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2011, 20h44   #4
Invité régulier
 
Inscription : décembre 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 40
Points : 8
Points : 8
En gros, le soucis est que je n'arrive pas à afficher les nombres sous leur forme complète plutôt que sous leur forme scientifique.
Le format en sortie t'affichera les 0 inutiles si tu utilises cette fonction :

Code :
SELECT CAST( 1 / POWER( 10, 4  )  AS DECIMAL( 12, 6  )  )
Cet exemple affichera 0.000100 si je ne me trompe pas.
Du coup, j'avais dans l'idée de mettre la donnée nb_decimales à la fois dans la fonction POWER et dans le nombre de décimales du CAST, mais ça ne fonctionne pas.
MrWeb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 09h09   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 998
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 998
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par MrWeb Voir le message
Code :
SELECT CAST( 1 / POWER( 10, 4  )  AS DECIMAL( 12, 6  )  )
Cet exemple affichera 0.000100 si je ne me trompe pas.
Effectivement et c'est logique puisque tu demandes 6 décimales !
Le chiffre 1 en DECIMAL (12, 6) s'écrira 1,000000.

Citation:
Du coup, j'avais dans l'idée de mettre la donnée nb_decimales à la fois dans la fonction POWER et dans le nombre de décimales du CAST, mais ça ne fonctionne pas.
C'est pourtant ce que j'ai fait non ?
Citation:
Envoyé par CinéPhil
J'ai du mal à comprendre ton problème.

Si je fais cette requête :
Code :
SELECT CAST( 1 / POWER( 10, 6  )  AS DECIMAL( 12, 6  )  )
MySQL m'affiche : 0.000001
Citation:
En gros, le soucis est que je n'arrive pas à afficher les nombres sous leur forme complète plutôt que sous leur forme scientifique.
Mais avec ta dernière requête ou la mienne, tu n'affiches pas le nombre sous sa forme scientifique 1E-6 !

Une fois de plus :
Citation:
J'ai du mal à comprendre ton problème.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 15h46   #6
Invité régulier
 
Inscription : décembre 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 40
Points : 8
Points : 8
La fonction CAST(... AS DECIMAL(x,y)) doit contenir deux valeurs constantes si ont veut que ça marche.

L'importance pour moi de récupérer un nombre bien formaté, est qu'il est exporté tel-quel dans un fichier csv.

Pour en revenir à la fonction proposée :
Code :
SELECT CAST(1 / POWER(10, 6)  AS DECIMAL(12, 6 ))
Elle ne fonctionnera pas si je met :
Code :
SELECT CAST(Matable.monNombre / POWER(10, maTable.nombreDecimales)  AS DECIMAL(12, maTable.nombreDecimales))
MrWeb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h14.


 
 
 
 
Partenaires

Hébergement Web