PostgreSQL nie definiuje round(double precision, integer)
. Z powodów @Mike Sherrill „Przypomnij sobie kota” wyjaśnia w komentarzach, że wersja round, która przyjmuje precyzję, jest dostępna tylko dla 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)
(Powyżej zauważ, że float8
to tylko skrótowy alias dla double precision
. Możesz zobaczyć, że PostgreSQL rozszerza go w danych wyjściowych).
Musisz rzutować zaokrągloną wartość do numeric
użyć dwuargumentowej formy round
. Wystarczy dołączyć ::numeric
dla skróconego rzutowania, np. round(val::numeric,2)
.
Jeśli formatujesz do wyświetlania użytkownikowi, nie używaj round
. Użyj to_char
(patrz:funkcje formatowania typu danych w podręczniku), który pozwala określić format i daje text
wynik, na który nie ma wpływu żadne dziwactwo, które Twój język klienta może zrobić z numeric
wartości. Na przykład:
regress=> SELECT to_char(float8 '3.1415927', 'FM999999999.00');
to_char
---------------
3.14
(1 row)
to_char
zaokrągli liczby w ramach formatowania. FM
prefiks mówi to_char
że nie chcesz żadnego wypełnienia z wiodącymi spacjami.