Проблема округления Postgresql BIGINT to Double Precision

У меня есть столбец значений bigint, например. 62639999999999993, и я хочу разделить его на 10^18 (точно). Кажется очень разумным, я должен получить 0,062639999999999993. Вместо этого я продолжаю получать 0,06263999999999999.

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

Я также пробовал вариант SET extra_float_digits = 3 безрезультатно.

Это какая-то проблема с моим ПК? Это 64-разрядная база данных PostgreSQL 12.4 на моем локальном рабочем столе под управлением Windows 10. ЦП — i7-10700k с 16 ГБ ОЗУ. Нет разгона.


person Brad    schedule 23.04.2021    source источник
comment
Отвечает ли это на ваш вопрос? Математика с плавающей запятой нарушена?   -  person Amadan    schedule 23.04.2021
comment
В SQL используйте DECIMAL для произвольной точности. .   -  person Amadan    schedule 23.04.2021
comment
@Amadan, в PGSQL нет никакой разницы между DECIMAL и NUMERIC (stackoverflow.com/a/33730552/155110) . Упомянутый пост также не отвечает на мой вопрос, поскольку я не использую типы с плавающей запятой (неточные), я использую числовые, которые являются точными в PGSQL до 131072 цифр до десятичной точки; до 16383 знаков после запятой   -  person Brad    schedule 23.04.2021
comment
Действительно, вы упомянули о попытке, но не о том, как вы это сделали. SELECT v / CAST (10 AS DECIMAL(100, 50)) ^ 18 FROM t дает 0.06263999999999999300000000000000000000000000000000. Если вы пишете 10^18, это число с плавающей запятой, а не десятичное (или числовое; да, они идентичны).   -  person Amadan    schedule 23.04.2021


Ответы (1)


Ваша проблема в том, что 10^18 является двойным, поэтому при делении вашего int на это двойное число остается двойным. Чтобы расчет был точным, вам нужно разыграть 10^18.

postgres=# select 62639999999999993::bigint / 10^18;
      ?column?
---------------------
 0.06263999999999999
(1 row)

postgres=# select 62639999999999993::bigint / 10^18::numeric;
        ?column?
------------------------
 0.06263999999999999300
(1 row)
person Blue Star    schedule 23.04.2021
comment
Блин! Спасибо. - person Brad; 23.04.2021