PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:arrotondamento dei numeri in virgola mobile

Prova

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

funziona con qualsiasi versione di PostgreSQL.

Ci sono una mancanza di sovraccarichi in alcune funzioni di PostgreSQL, perché (???):penso che "è una mancanza" e di seguito mostro la mia soluzione alternativa, ma vedi questa discussione per ulteriori spiegazioni .

Sovraccarico come strategia di casting

Puoi sovraccarico la funzione ROUND con,

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

Ora le tue istruzioni funzioneranno bene, prova (dopo la creazione della funzione)

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

ma restituisce un tipo NUMERIC... Per preservare il primo sovraccarico di uso comune, possiamo restituire un float quando viene offerto un parametro di testo,

 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;

Prova

 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:puoi controllare il sovraccarico con \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                                              

Le funzioni pg_catalog sono quelle predefinite, vedere manual of build-in math funzioni .