PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL - Rundung von Gleitkommazahlen

Versuchen Sie es

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

funktioniert mit jeder Version von PostgreSQL.

In einigen PostgreSQL-Funktionen fehlen Überladungen, warum (???):Ich denke, "es ist ein Mangel", und zeige unten meine Problemumgehung, aber siehe diese Diskussion für weitere Erklärungen .

Überladen als Wurfstrategie

Sie können überladen die ROUND-Funktion mit,

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

Jetzt funktioniert Ihre Anweisung einwandfrei, versuchen Sie es (nach der Funktionserstellung)

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

aber es gibt einen Typ NUMERIC zurück... Um die erste allgemeine Überladung zu bewahren, können wir ein Float zurückgeben, wenn ein Textparameter angeboten wird,

 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;

Versuchen Sie es

 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:Sie können die Überladung mit \df,

überprüfen
 \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                                              

Die pg_catalog-Funktionen sind die Standardfunktionen, siehe manual of built-in math Funktionen .