Округление SUM (Float) до одного десятичного разряда в PostGreSQL [дубликат]

Вы можете попробовать использовать что-то вроде HTML Tidy , чтобы очистить любой «сломанный» HTML и преобразовать HTML в XHTML, который затем можно разобрать с помощью парсера XML.

102
задан Nikolay Fominyh 19 January 2016 в 17:37
поделиться

5 ответов

PostgreSQL не определяет round(double precision, integer). По причинам, которые @Catcall объясняет в комментариях, версия раунда, которая принимает точность, доступна только для 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)

(В приведенном выше примечании обратите внимание, что float8 является просто сокращенным псевдонимом для double precision. Вы можете видеть, что PostgreSQL расширяет его на выходе).

Вы должны указать значение, округленное до numeric, для использования двухфакторной формы round. Просто добавьте ::numeric для стенографического броска, например round(val::numeric,2).


Если вы форматируете для отображения пользователю, не используйте round. Используйте to_char (см. функции форматирования типа данных в руководстве), который позволяет указать формат и дает результат text, на который не влияет какая бы странность, на которую может повлиять ваш язык клиента с значениями numeric. Например:

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

to_char будет округлять числа для вас как часть форматирования. Префикс FM сообщает to_char, что вы не хотите добавлять пробелы с ведущими пробелами.

147
ответ дан Craig Ringer 31 August 2018 в 18:11
поделиться

Попробуйте следующее:

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

Или просто:

SELECT round (2/3::DECIMAL, 2)::TEXT
-- RESULT: 0.67
14
ответ дан atiruz 31 August 2018 в 18:11
поделиться

Попробуйте также старый синтаксис для кастинга,

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

работает с любой версией PostgreSQL.

В некоторых функциях PostgreSQL наблюдается нехватка перегрузок (почему? ?): Я думаю, что «это недостаток» (!), Но @CraigRinger, @Catcall и команда PostgreSQL согласны с «историческим обоснованием pg».

PS: еще одна точка вокруг округления - это точность, проверьте @ ответ ЯнКенни .


Перегрузка в качестве стратегии кастинга

Вы может перегрузить функцию ROUND с помощью

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

Теперь ваша инструкция будет работать нормально, попробуйте (после создания функции)

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

, но она вернется NUMERIC ... Чтобы сохранить первую перегрузку коммо-использования, мы можем вернуть FLOAT-тип, когда предлагается параметр 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;

Попробовать

 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: проверка \df round после перегрузок, покажет что-то вроде:

 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          

Функции pg_catalog являются стандартными, см. руководство по встроенным математическим функциям ].

51
ответ дан Community 31 August 2018 в 18:11
поделиться

Ошибка: функция round (double precision, integer) не существует

Решение: вам нужно добавить тип добавления, тогда он будет работать

Пример: round(extract(second from job_end_time_t)::integer,0)

2
ответ дан huzeyfe 31 August 2018 в 18:11
поделиться

В соответствии с ответом Брайана вы можете сделать это, чтобы ограничить десятичные числа в запросе. Я конвертирую из км / ч в м / с и показываю его в виде диграфов, но когда я это делал в диграфах, это выглядело странно. Хорошо выглядит при выполнении вычислений в запросе. Это относится к postgresql 9.5.1.

select date,(wind_speed/3.6)::numeric(7,1) from readings;
2
ответ дан kometen 31 August 2018 в 18:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: