2013-11-27 1 views
1

У меня есть столбец с двойной точностью в моей базе данных под названием «позиция».postgres query на столбце двойной точности не возвращает правильные результаты

Если у меня есть строка со значением в этом столбце,: 0.564593301435407

И у меня есть запрос, который имеет WHERE заявление вроде следующего:

WHERE "position" >= 0.564593301435407 

(т.е. Запрашивание больше чем или равны этому точному значению)

Это НЕ возвращает эту колонку.

Зачем это было?

ответ

3

Я не мог воспроизвести точную проблему: http://sqlfiddle.com/#!15/4cb15/6

Однако в 15 значащих цифрах вы очень близки к пределу точности на двойных точностях, и скрипка предполагает, что значение может быть округлены до получения 0.56459330143541, где числовое значение не было бы.

Я бы предположил, что если сравнение высокой точности является для вас приоритетом, то numeric - лучший выбор типа данных.

+2

О, вы уже писали то же самое. Так что я удалил свой обман. +1, и я взял на себя смелость и добавил ссылку на руководство. –

+0

Да, это проблема точности с плавающей запятой. Если я округлю числа до 4-5 знаков после запятой, это решит большинство проблем с точными сравнениями, или я все еще рискую проблемами, потому что он все еще хранится как плавающая точка? –

+1

Одна из проблем заключается в том, что числа с плавающей запятой не подходят для точного хранения произвольных десятичных знаков. Интересное чтение - http://www.postgresql.org/docs/9.1/static/datatype-numeric.html#DATATYPE-FLOAT. Лично для меня это бесполезно. Меня больше интересует точность хранения и сравнения для десятичных чисел, чем любые преимущества, которые могут иметь плавающие точки. –

1

Я подозреваю, что вы страдаете от Floating Point Accuracy Problems. В частности, это запах кода для сравнения значений с плавающей запятой для равенства из-за ошибок округления при преобразовании между двоичным и десятичным.

Смежные вопросы