una truncar suma redondear los limitar float digitos decimales sql postgresql sequel

truncar - sql server float 2 decimales



¿Cómo redondear un promedio de 2 decimales en PostgreSQL? (5)

Error: la función redonda (precisión doble, número entero) no existe

Solución : necesitas agregar yeso, entonces funcionará

Ej: round(extract(second from job_end_time_t)::integer,0)

Estoy usando PostgreSQL a través de Ruby gem ''secuela''.

Estoy tratando de redondear a dos decimales.

Aquí está mi código:

SELECT ROUND(AVG(some_column),2) FROM table

Obtuve el siguiente error:

PG::Error: ERROR: function round(double precision, integer) does not exist (Sequel::DatabaseError)

No obtengo ningún error cuando ejecuto el siguiente código:

SELECT ROUND(AVG(some_column)) FROM table

¿Alguien sabe lo que estoy haciendo mal?


PostgreSQL no define round(double precision, integer) . Por razones @Catcall explica en los comentarios, la versión de la ronda que requiere precisión solo está disponible para numeric .

regress=> SELECT round( float8 ''3.1415927'', 2 ); ERROR: function round(double precision, integer) does not exist regress=> /df *round* List of functions Schema | Name | Result data type | Argument data types | Type ------------+--------+------------------+---------------------+-------- pg_catalog | dround | double precision | double precision | normal pg_catalog | round | double precision | double precision | normal pg_catalog | round | numeric | numeric | normal pg_catalog | round | numeric | numeric, integer | normal (4 rows) regress=> SELECT round( CAST(float8 ''3.1415927'' as numeric), 2); round ------- 3.14 (1 row)

(En lo anterior, tenga en cuenta que float8 es solo un alias abreviado para double precision . Puede ver que PostgreSQL lo está expandiendo en la salida).

Debe convertir el valor redondeado a numeric para usar la forma de round de dos argumentos. Simplemente agregue ::numeric para el molde de taquigrafía, como round(val::numeric,2) .

Si está formateando para mostrar al usuario, no use round . Use to_char (consulte: funciones de formateo del tipo de datos en el manual), que le permite especificar un formato y le proporciona un resultado de text que no se ve afectado por las rarezas que pueda causar el idioma de su cliente con numeric valores numeric . Por ejemplo:

regress=> SELECT to_char(float8 ''3.1415927'', ''FM999999999.00''); to_char --------------- 3.14 (1 row)

to_char redondeará números para ti como parte del formateo. El prefijo FM le dice to_char que no quiere ningún relleno con espacios to_char .


Prueba con esto:

SELECT to_char (2/3::float, ''FM999999990.00''); -- RESULT: 0.67

O simplemente:

SELECT round (2/3::DECIMAL, 2)::TEXT -- RESULT: 0.67


Pruebe también la vieja sintaxis para el casting,

SELECT ROUND(AVG(some_column)::numeric,2) FROM table;

funciona con cualquier versión de PostgreSQL.

Hay una falta de sobrecargas en algunas funciones de PostgreSQL, ¿por qué (???): creo que "es una falta" (!), Pero @CraigRinger, @Catcall y el equipo de PostgreSQL coinciden en "la lógica histórica de pg".

PD: otro punto sobre el redondeo es la precisión , verifique la respuesta de IanKenney .

Sobrecarga como estrategia de lanzamiento

Puede overload la función REDONDO con,

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

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

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

pero devuelve un tipo NUMERIC ... Para conservar la primera sobrecarga de uso común, podemos devolver un tipo FLOAT cuando se ofrece un parámetro TEXT,

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... complete! ELSE ''NaN''::float -- like an error message END; $$ language SQL IMMUTABLE;

Tratar

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: comprobar /df round después de las sobrecargas, mostrará algo así como,

Schema | Name | Result data type | Argument data types ------------+-------+------------------+---------------------------- myschema | round | double precision | double precision, text, int myschema | round | numeric | double precision, int pg_catalog | round | double precision | double precision pg_catalog | round | numeric | numeric pg_catalog | round | numeric | numeric, int

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


Según Bryan''s respuesta Bryan''s puedes hacer esto para limitar los decimales en una consulta. Convierto de km / h a m / s y lo visualizo en dygraphs pero cuando lo hice en dygraphs me pareció raro. Se ve bien al hacer el cálculo en la consulta en su lugar. Esto está en postgresql 9.5.1.

select date,(wind_speed/3.6)::numeric(7,1) from readings;