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

PostgreSQL - afrunding af flydende kommatal

Prøv

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

fungerer med enhver version af PostgreSQL.

Der er mangel på overbelastninger i nogle PostgreSQL-funktioner, hvorfor (???):Jeg tror "det er en mangel", og nedenfor viser min løsning, men se denne diskussion for at få flere forklaringer .

Overbelastning som castingstrategi

Du kan overloade funktionen ROUND med,

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

Nu vil din instruktion fungere fint, prøv (efter funktionsoprettelse)

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

men det returnerer en type NUMERIC... For at bevare den første almindelige overbelastning kan vi returnere en float, når en tekstparameter tilbydes,

 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;
 

Prøv

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:Du kan kontrollere overbelastningen ved at \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

Pg_catalog-funktionerne er standardfunktionerne, se manual til indbygget matematik funktioner .



  1. Sådan vælger du poster fra de sidste 24 timer i PostgreSQL

  2. PHP, MySQL:kan ikke forklare denne udefinerede indeksfejl

  3. Oprettelse af en app til Django-filmanbefaling ved hjælp af Jaccard-indeks

  4. Bufres dbms_output.put() anderledes end dbms_output.put_line()?