PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL - arredondando números de ponto flutuante


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

funciona com qualquer versão do PostgreSQL.

Há uma falta de sobrecargas em algumas funções do PostgreSQL, por que (???):acho que "é uma falta", e abaixo mostro minha solução alternativa, mas veja esta discussão para mais explicações .

Sobrecarga como estratégia de elenco


Você pode sobrecarregar a função ROUND com,
 CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
    SELECT ROUND($1::numeric,$2);
 $$ language SQL IMMUTABLE;

Agora sua instrução funcionará bem, tente (após a criação da função)
 SELECT round(1/3.,4); -- 0.3333 numeric

mas retorna um tipo NUMERIC... Para preservar a primeira sobrecarga de uso comum, podemos retornar um float quando um parâmetro de texto é oferecido,
 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;

Tentar
 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:Você pode verificar a sobrecarga por \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                                              

As funções pg_catalog são as padrão, veja manual of build-in math funções .