Двойная точность к varchar postgresql - PullRequest
1 голос
/ 16 апреля 2019

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

Версия Postgres: PostgreSQL 10.4, скомпилированная в Visual C ++ build 1800, 64-битная

ALTER TABLE my_table ALTER COLUMN field_double_precision TYPE varchar;

--After the change this is my problem, new value is very different to old value

id     |old_value  |new_value              |
-------|-----------|-----------------------|
9009   |0.06       | 0.059999999999999998  |
9010   |0.56       | 0.56000000000000005   |
9011   |0.068      | 0.068000000000000005  |
9012   |0.568      | 0.56799999999999995   |

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

Мой тест:

SELECT  CAST (0.059999999999999998 AS DOUBLE PRECISION) old_value;

old_value |
----------|
0.06      |

-----------------------------------------------------------------------
SELECT  CAST (0.059999999999999998 AS double PRECISION)::VARCHAR new_value;

new_value            |
---------------------|
0.059999999999999998 |

Могу ли я сохранить старое и новое значение равными? Что произойдет, когда postgres отформатирует двойную точность в varchar?

Ответы [ 2 ]

3 голосов
/ 16 апреля 2019

Перед запуском оператора ALTER TABLE, который изменяет тип данных на character varying, убедитесь, что вы выполнили следующий оператор:

SET <a href="https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-EXTRA-FLOAT-DIGITS" rel="nofollow noreferrer">extra_float_digits</a> = 0;

Это заставит PostgreSQL подавлять незначительные десятичные цифры при рендеринге числа с плавающей запятой в виде строки.

0 голосов
/ 16 апреля 2019

В соответствии с документацией Postgresql здесь Double Precision работает следующим образом.

Типы данных вещественная и двойная точность - неточные числовые типы переменной точности.На практике эти типы обычно являются реализациями стандарта IEEE 754 для двоичной арифметики с плавающей запятой (одинарной и двойной точности соответственно) в той степени, в которой это поддерживается базовым процессором, операционной системой и компилятором.

Неточноозначает, что некоторые значения не могут быть преобразованы точно во внутренний формат и хранятся в виде приблизительных значений, поэтому при сохранении и извлечении значения могут обнаруживаться небольшие расхождения.Управление этими ошибками и то, как они распространяются посредством вычислений, является предметом целой отрасли математики и компьютерных наук и не будет обсуждаться здесь, за исключением следующих моментов:

  • Если вам требуется точное хранение и вычисления(например, для денежных сумм), используйте вместо этого числовой тип.
  • Если вы хотите выполнять сложные вычисления с этими типами для чего-то важного, особенно если вы полагаетесь на определенное поведение в
    граничных случаях (бесконечность,underflow), вам следует тщательно оценить реализацию
    .
  • Сравнение двух значений с плавающей точкой на равенство может не всегда работать должным образом.

Как насчет приведениядвойная точность к числовому, а затем приведение этого числового значения к varchar?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...