IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

double precision mais pas de chiffres après la virgule


Sujet :

PostgreSQL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Points : 287
    Points
    287
    Par défaut double precision mais pas de chiffres après la virgule
    Bonjour,


    Je début sous Postgre

    J'ai créé un champ rarete de type double precision

    alter table releves add column rarete double precision

    j'ai mis à jour cette table avec uen donnée de pourcentage mais la valeur retournée ne comporte pas de chiffres après la virgule.


    ai-je choisi le bon type de données?

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    cf la doc http://www.postgresql.org/docs/9.1/s...e-numeric.html

    double precision c'est 15 decimal.

    Maintenant avez-vous besoin de 15 décimales ?
    Un numeric(2,X) où X est le nombre maximal souhaité, serai plus adéquate.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Points : 287
    Points
    287
    Par défaut
    si double precision permet d'afficher 15 décimales, pourquoi ne m'en affiche t il aucune?

    j'ai créé une colonne de type numeric(2,2) pour 2 décimales (y a-t-il une écriture plus simple, d'ailleurs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table releves add column rarete numeric(2,2)
    Au lancement de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update releves set rarete4 = 100 -(100*nbmaillestaxon/nbmaillesdep)
    il me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ERREUR:  champ numérique en dehors des limites
    DETAIL:  Un champ de précision 2 et d'échelle 2 doit être arrondi à une valeur
    absolue inférieure à 1.
     
    ********** Erreur **********
     
    ERREUR: champ numérique en dehors des limites
    État SQL :22003
    Détail :Un champ de précision 2 et d'échelle 2 doit être arrondi à une valeur
    absolue inférieure à 1.
    toute aide est la bienvenue.

    Désolé pour ces questions qui peuvent paraître évidentes pour les utilisateurs avancés.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,


    Alors en fait là pgsql va interpréter votre demande assez ...spécialement.

    Essyer ceci :
    => 0

    et maintenant :
    => 0.07054673721340388007

    que c'est-il passé ? dans le 1er cas il va caster votre résultat comme un integer.
    Dans le 2eme cas, vu que l'on a mit ".0" il va caster le résultat comme un numeric.

    Donc soit vous forcez la caste manuellement avec "CAST(mon_nombre as numeric)" soit vous rajoutez ".0".
    Ensuite n'oubliez pas de round votre résultat sinon il y a des chances qu'il tronque tout simplement (je n'ai pas testé, donc à vérifier).

    Ce qui nous donne au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE releves SET rarete4 = 100.0 -(100.0*nbmaillestaxon/nbmaillesdep)
    Ceci renvera un résultat de type numeric donc avec une vigule


    j'ai créé une colonne de type numeric(2,2) pour 2 décimales (y a-t-il une écriture plus simple, d'ailleurs)
    Non il n'y a pas plus simple comme écriture.

    Par contre vous pouvez créer un domain qui sera de type numeric(2, 2), et ce domain sera ré-utilisable de partout dans votre schéma.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE DOMAIN d_pourcentage
       AS numeric(2,2);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create table t_pct (mon_nbr d_pourcentage);

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    465
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 465
    Points : 287
    Points
    287
    Par défaut
    merci beaucoup pour toutes ces informations. c'est nickel!

    j'en apprends, des choses, d'un seul coup

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Si vous ne voulez pas de décimale, pourquoi ne pas travailler avec les types entiers INT ( =/ - 2 milliards) ou BIGINT (+/-2^63) ???

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    Citation Envoyé par mathieu_r Voir le message
    si double precision permet d'afficher 15 décimales, pourquoi ne m'en affiche t il aucune?

    j'ai créé une colonne de type numeric(2,2) pour 2 décimales (y a-t-il une écriture plus simple, d'ailleurs)
    NB
    numeric(2,2) ne permet pas de stocker des nombres de 0.00 à 1.00 mais de 0.00 à 0.99 : 100% (1.00) ne peut pas être exprimé dans ce format.

    maintenant si ce que vous voulez stocker ce sont des % [0.; 100.0] avec une précision de 2 décimales c'est numeric(5,2) que vous devez utiliser, éventuellement avec une contrainte "check(rarete >= 0.0 and rarete <= 100.0)".

    (ou utiliser un autre format numérique que "numeric(precision, scale)" …)

  8. #8
    Membre habitué

    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 101
    Points : 141
    Points
    141
    Par défaut
    Le casting peut être aussi utilisé sous cette forme plus courte pour forcer la précision vers les décimales.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO test_precision (valeur) VALUES (15/100::double precision );
    Insère bien 0.15.

    L'avantage est que la valeur entrée par l'utilisateur n'est pas altérée et que le CAST n'est indiqué qu'une seule fois pour toute l'expression. Utile si un script effectue l'insertion. C'est vrai que ce n'est un comportement pas très consistant, PostgreSQL pourrait caster par défaut en écriture dans le type du champs...

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/12/2008, 14h00
  2. le type de variable double et chiffres après la virgule
    Par tsdia2 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 14/06/2008, 12h27
  3. Réponses: 1
    Dernier message: 21/04/2008, 16h00
  4. Réponses: 4
    Dernier message: 20/09/2007, 14h08
  5. Réponses: 2
    Dernier message: 10/09/2006, 12h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo