Почему значения с плавающей запятой можно найти только в виде текста, где условия - PullRequest
0 голосов
/ 28 мая 2018

Почему не удается найти строку, если аргумент не заключен в кавычки?

CREATE TABLE test (id integer, value real);
INSERT INTO test VALUES (1, 0.1);

Не работает:

SELECT * FROM test where value = 0.1;
 id | value
----+-------
(0 rows)

Работает!

SELECT * FROM test where value = '0.1';
 id | value
----+-------
  1 |   0.1
(1 row)

1 Ответ

0 голосов
/ 28 мая 2018

Вам следует избегать неточных типов данных (например, real) :

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

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

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

  • Сравнение двух значений с плавающей запятой для равенства может не всегда работать должным образом.

Если вы настаиваете на использовании real, убедитесь, что оба аргумента имеют одинаковый тип данных:

SELECT * FROM test where value = 0.1::real;

DBFiddle Demo

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