Précédent   Forum du club des développeurs et IT Pro > Bases de données > PostgreSQL > Outils
Outils Forum d'entraide sur les outils d'administration de PostgreSQL : PgAdmin, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/07/2012, 15h27   #1
rupteur
Membre habitué
 
Homme Eric
Informaticien
Inscription : juin 2004
Messages : 121
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations professionnelles :
Activité : Informaticien
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : juin 2004
Messages : 121
Points : 116
Points : 116
Par défaut pgadmin affichage double précision

bonjour à tous,

je suis sous postgresql 9.1 avec pgadmin 1.14.3

je rencontre sous pgadmin, un problème d'affichage des valeurs en double précision
par exemple pour une valeur stockée en base 30.39993, pgadmin m'affiche 30.4

peut-on le forcer à afficher la vrai valeur ?

(note: l'utilitaire console psql effectue aussi l'arrondi )


merci pour votre aide.
rupteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2012, 15h35   #2
punkoff
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 2 160
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 2 160
Points : 3 494
Points : 3 494
bonjour,

http://www.postgresql.org/docs/9.1/i...e-numeric.html

double et double précision sont des types numéric inexact.

Etes-vous sur qu'en base il y a bien ce nombre exactement d'enregistré ?
(en faisant une multiplication par 100 par exemple ...)
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2012, 15h41   #3
rupteur
Membre habitué
 
Homme Eric
Informaticien
Inscription : juin 2004
Messages : 121
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations professionnelles :
Activité : Informaticien
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : juin 2004
Messages : 121
Points : 116
Points : 116
oui, j'ai fait un pg_dump de la base et j'ai bien le nombre enregistré en 30.39993
rupteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2012, 16h07   #4
punkoff
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 2 160
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 2 160
Points : 3 494
Points : 3 494
A combien est votre paramètre de session : extra_float_digits ? -10 ?

Code :
1
2
 
SHOW extra_float_digits
Essayez de le mettre à 0 si c'est le cas.

Code :
1
2
 
SET extra_float_digits = 0;
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2012, 16h57   #5
rupteur
Membre habitué
 
Homme Eric
Informaticien
Inscription : juin 2004
Messages : 121
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations professionnelles :
Activité : Informaticien
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : juin 2004
Messages : 121
Points : 116
Points : 116
extra_float_digits me retourne 0.
rupteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2012, 22h53   #6
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 702
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 702
Points : 2 347
Points : 2 347
Déjà comment reproduire le problème?
En effet:
Code :
1
2
3
4
CREATE TABLE testdouble(a double precision);
INSERT INTO a VALUES(30.39993);
INSERT INTO testdouble VALUES(30.39993);
SELECT * FROM testdouble ;
Résultat
    a     
----------
 30.39993
(1 row)
et non pas 30.4
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2012, 07h55   #7
rupteur
Membre habitué
 
Homme Eric
Informaticien
Inscription : juin 2004
Messages : 121
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations professionnelles :
Activité : Informaticien
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : juin 2004
Messages : 121
Points : 116
Points : 116
en fait le "problème" semble se situer au niveau du stockage.
par exemple :
Code :
INSERT INTO test VALUES (30.4)
voici ce que me donne pg_dump
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
CREATE TABLE test (
    test double precision
);
 
 
ALTER TABLE public.test OWNER TO postgres;
 
--
-- Data for Name: test; Type: TABLE DATA; Schema: public; Owner: postgres
--
 
COPY test (test) FROM stdin;
30.3999999999999986
\.
j'accède à ces données via jdbc et contrairement à pgadmin le driver java me renvoi 30.999999... et non 30.4

je n'avais jamais remarqué cela jusqu'au changement de version de jdbc

Peut être est ce un fonctionnement normal mais neamoins curieux
rupteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2012, 10h38   #8
punkoff
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 2 160
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 2 160
Points : 3 494
Points : 3 494
Avez-vous lu l'article de la doc que je vous ai linké plus haut ..?
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2012, 11h40   #9
rupteur
Membre habitué
 
Homme Eric
Informaticien
Inscription : juin 2004
Messages : 121
Détails du profil
Informations personnelles :
Nom : Homme Eric
Localisation : France

Informations professionnelles :
Activité : Informaticien
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : juin 2004
Messages : 121
Points : 116
Points : 116
oui et je vous en remercie.

je l'ai aussi lu en français (on ne sait jamais)
http://docs.postgresql.fr/9.1/dataty...tatype-numeric

j'ai bien compris que le stockage pouvait être approximatif.

mais je suis surpris de tant de "dérive" sur une seule décimale.
pourquoi se compliquer la vie ?

comme je l'ai dis précédemment c'est le changement de driver jdbc qui ma révélé cette curiosité.
je vais donc revoir le type de champ qui stocke ces données.

Merci pour tout !
rupteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2012, 14h47   #10
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 702
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 702
Points : 2 347
Points : 2 347
Citation:
Envoyé par rupteur Voir le message
j'ai bien compris que le stockage pouvait être approximatif.

mais je suis surpris de tant de "dérive" sur une seule décimale.
pourquoi se compliquer la vie ?
C'est parce que le nombre est stocké en binaire flottant et pas en décimal flottant.
En binaire il y a problablement une infinité de chiffres après la virgule sur ce nombre 30.4
Mais si c'était 30.5 par exemple il n'y aurait aucune "dérive".
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h06.


 
 
 
 
Partenaires

Hébergement Web