PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL - arrondir les nombres à virgule flottante

Essayez

SELECT round((1/3.)::numeric,4);

fonctionne avec n'importe quelle version de PostgreSQL.

Il y a un manque de surcharges dans certaines fonctions PostgreSQL, pourquoi (???):je pense "c'est un manque", et ci-dessous montre ma solution de contournement, mais voir cette discussion pour plus d'explications .

La surcharge comme stratégie de casting

Vous pouvez surcharger la fonction ARRONDI avec,

 CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
    SELECT ROUND($1::numeric,$2);
 $$ language SQL IMMUTABLE;

Maintenant, votre instruction fonctionnera bien, essayez (après la création de la fonction)

 SELECT round(1/3.,4); -- 0.3333 numeric

mais il renvoie un type NUMERIC... Pour préserver la première surcharge d'usage commun, nous pouvons renvoyer un flottant lorsqu'un paramètre de texte est proposé,

 CREATE FUNCTION ROUND(float, text, int DEFAULT 0) 
 RETURNS FLOAT AS $$
    SELECT CASE WHEN $2='dec'
                THEN ROUND($1::numeric,$3)::float
                -- ... WHEN $2='hex' THEN ... WHEN $2='bin' THEN... 
                ELSE 'NaN'::float  -- is like a error message 
            END;
 $$ language SQL IMMUTABLE;

Essayez

 SELECT round(1/3.,'dec',4);   -- 0.3333 float!
 SELECT round(2.8+1/3.,'dec',1); -- 3.1 float!
 SELECT round(2.8+1/3.,'dec'::text); -- need to cast string? pg bug 

PS :Vous pouvez vérifier la surcharge par \df,

 \df round
  Schema    | Name  | Datatype of result        |    Datatype of parameters                       
 -----------+-------+---------------------------+--------------------------------
 myschema   | round | numeric                   | double precision, integer                                     
 myschema   | round | double precision          | double precision, text, integer
 pg_catalog | round | double precision          | double precision                                              
 pg_catalog | round | numeric                   | numeric                                                       
 pg_catalog | round | numeric                   | numeric, integer                                              

Les fonctions pg_catalog sont celles par défaut, voir manual of build-in math fonctions .