- •Типы данных sql
- •Tочные числовые типы
- •Истинно целые типы
- •Точные типы, допускающие наличие дробной части
- •Приближенные числовые типы
- •Типы символьных строк
- •Типы битовых строк
- •Типы даты и времени
- •Тип даты
- •Типы времени
- •Типы временной метки
- •Типы времени и временной метки с временной зоной
- •Типы временных интервалов
- •Булевский тип
- •Типы коллекций
- •Типы массивов
- •Типы мультимножеств
- •Анонимные строчные типы
- •Типы, определяемые пользователем
- •Ссылочные типы
- •Типы данных PostgreSql 8.4.2
- •8.1. Числовые типы
- •8.1.1. Целочисленные типы
- •8.1.2. Числа с заданной точностью
- •8.1.3. Типы с плавающей точкой
- •8.1.4. Серийные типы
- •8.2. Денежные типы
- •8.3. Символьные типы
- •8.4. Двоичные типы данных
- •8.5. Типы дата/времени
- •8.5.6. Некоторые подробности по датам
- •8.6. Логический тип
- •8.7. Перечисления
- •8.8. Геометрические типы
- •8.9. Типы сетевых адресов
- •8.10. Типы битовых строк
- •8.11. Типы текстового поиска
- •8.11.1. Tsvector
- •8.11.2. Tsquery
- •8.12. Тип uuid
- •8.13. Тип xml
8.1.3. Типы с плавающей точкой
Типы данных real и double precision являются неточными числовыми типами с переменной точностью. На практике, эти типы обычно реализуются по стандарту IEEE Standard 754 для Двоичной Арифметики с Плавающей Точкой (соответственно одинарной и двойной точности), согласно поддержке этих типов, процессором, операционной системой и компилятором.
Слово "неточный", применительно к этим типам означает, что некоторые значения не могут быть точно преобразованы во внутренний формат этих типов и поэтому они хранятся как приблизительные значения, так что если сохранить, а потом получить какое-либо значение, то можно увидеть незначительные отличия. Управление такими ошибками и то как они разрастаются при вычислениях — это тема целой ветки математики и компьютерной науки. Поэтому здесь это рассказываться не будет, за исключением следующих моментов:
Если требуется точное хранение и вычисление значений (таких как денежные величины), используйте вместо данных типов, тип numeric.
Если вы хотите выполнять сложные вычисления с этими типами для каких-либо важных целей, особенное если вы надеетесь на определённое поведение в граничных моментах (бесконечность, переполнение) вы должны реализовывать такие вычисления осторожно.
Сравнение двух значений с плавающей точкой на равенство может работать, а может и не работать так, как вы ожидаете.
На большистве платформ, тип real имеет диапазон как минимум от 1E-37 до 1E+37 с точностью по меньшей мере в 6 десятичных разрядов. Тип double precision обычно имеет диапазон от 1E-307 до 1E+308 с точностью по меньшей мере в 15 разрядов. Значения, которые слишком велики или слишком малы приведут к ошибке. Если точность вводимых чисел слишком велика, возможно округление. Числа слишком приближающиеся к нулю, которые не могут быть представлены как отличные от нуля приведут к ошибке переполнения.
В дополнение к обычным числовым значениям, типы с плавающей точкой имеют некоторые специальные значения:
Infinity
-Infinity
NaN
Это соответствует специальным значениям стандарта IEEE 754 для "бесконечности", "минус бесконечности" и значению "не-число" соответственно. (На машине, где арифметика с плавающей точкой не соответствует стандарту IEEE 754, эти значения, предположительно, не будут работать так, как ожидается). При записи этих значений как констант в командах SQL, вы должны заключить их в одинарные кавычки, например, UPDATE table SET x = 'Infinity'. При вводе этих строк, они распознаются независимо от регистра букв.
Note: IEEE754 указывает, что NaN не должен быть равен любым другим значениям с плавающей точкой (включая NaN). Чтобы разрешить сортировку значений с плавающей точкой и использовать индексы, основанные на деревьях, PostgreSQL считает значения NaN равными или больше, чем все не-NaN.
PostgreSQL также поддерживает стандартную нотацию float и float(p) для задания неточных числовых типов. Здесь p указывает минимально доступную точность в двоичных разрядах. PostgreSQL принимает значения от float(1) до float(24) как тип real и значения от float(25) до float(53) как double precision. Значения p выходящие за этот допустимый диапазон приведут к ошибке. Указание float без точности означает double precision.
Note: До версии PostgreSQL 7.4, точность у float(p) означала количество десятичных разрядов. Для соответствия стандарту SQL, который говорит, что точность измеряется в двоичных разрядах — это было исправлено. Для типов real и double precision в мантиссе соответственно содержится 24 и 53 бит, что соответствует стандарту IEEE на реализацию чисел с плавающей точкой. На платформах не соответствующих стандарту IEEE, количество бит может быть меньше, но для простоты, на всех платформах используется одни и те же диапазоны p.