Дополнительные нули добавляются в течение раунда к двум десятичным точкам в postgres - PullRequest
1 голос
/ 17 июня 2019

Я пишу процедуру postgres.В этом я хочу округлить число с плавающей запятой до двух десятичных знаков и затем вставить это в таблицу.Я написал следующий код.

vara float8;
SELECT round( float8 '3.1415927', 2 ) into vara;
insert into dummyTable(columnA)values(vara).

Я хочу, чтобы столбец A содержал значение 3.14.Однако значение, которое вставляется, составляет 3.1400.

Тип данных столбца A является float8 с точностью и шкалой 17.

1 Ответ

2 голосов
/ 17 июня 2019

Существует только одна функция round с двумя аргументами, которая принимает numeric в качестве аргумента:

test=> \df round
                         List of functions
   Schema   | Name  | Result data type | Argument data types | Type 
------------+-------+------------------+---------------------+------
 pg_catalog | round | double precision | double precision    | func
 pg_catalog | round | numeric          | numeric             | func
 pg_catalog | round | numeric          | numeric, integer    | func
(3 rows)

Так что получается, что ваш float8 конвертируется в numeric (без масштаба), и результат того же типа. Это не даст конечные нули:

test=> SELECT round(3.14159265, 2);
 round 
-------
  3.14
(1 row)

Но если вы сохраните результат в столбце float8, вы можете получить ошибки округления:

test=> SET extra_float_digits = 3;
SET
test=> SELECT round(3.14159265, 2)::float8;
        round        
---------------------
 3.14000000000000012
(1 row)

Я рекомендую использовать numeric(10,2) или что-то похожее в качестве типа данных столбца таблицы, тогда округление произойдет автоматически, и значение не может иметь более двух десятичных знаков.

...