sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL:redondeo de números de coma flotante

Prueba

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

funciona con cualquier versión de PostgreSQL.

Hay una falta de sobrecargas en algunas funciones de PostgreSQL, por qué (???):creo que "es una falta", y a continuación muestro mi solución, pero vea esta discusión para obtener más explicaciones .

Sobrecarga como estrategia de casting

Puede sobrecargar la función REDONDA con,

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

Ahora su instrucción funcionará bien, intente (después de la creación de la función)

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

pero devuelve un tipo NUMÉRICO... Para preservar la primera sobrecarga de uso común, podemos devolver un flotante cuando se ofrece un parámetro de texto,

 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;

Prueba

 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 

PD:Puede comprobar la 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                                              

Las funciones de pg_catalog son las predeterminadas, consulte manual de funciones matemáticas incorporadas funciones .