Чтение онлайн

на главную - закладки

Жанры

Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Борри Хелен

Шрифт:

Например, DSQL распознает 16.92 как масштабируемое точное число и передаст его серверу в этой форме. С другой стороны, он будет трактовать 16.92Е0 как значение с плавающей точкой.

Типы данных с плавающей точкой

Типы данных с плавающей точкой служат "скользящими окнами" с точностью, подходящей масштабу числа. По своей природе в "плавающих" типах положение десятичной точки не зафиксировано - допустимо хранение в одном и том же столбце одного значения как 25.33333, а другого как 25.333. Эти значения различны и оба допустимы.

Определяйте

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

Числа с плавающей точкой могут быть использованы для представления значений, больших, чем это возможно для масштабируемых целых. Например, тип FLOAT может содержать числа с абсолютным значением не более 3.4Е38 (т. е. 34, за которым следует 37 нулей) и не менее 1.1Е-38 (37 нулей, 11 и затем десятичная точка).

Ширина диапазона достигается за счет потери точности. Число с плавающей точкой содержит приблизительное представление его значения с точностью до указанного количества цифр (его точности) в соответствии с текущим значением (масштабом). Оно не может содержать значение за пределами его диапазона.

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

Например, FLOAT может содержать число 1000000000 (1 000 000 000 или 10(^9^)). "Контейнер" FLOAT рассматривает данное число как 100000*Е4. (Это лишь иллюстрация - полное представление реализации чисел с плавающей точкой выходит за рамки настоящей книги и очень далеко от того, что узнал автор!). Если вы прибавите 1 к значению FLOAT, то будет проигнорирована информация в седьмом разряде, потому что она не является значимой для текущего значения числа и его точности. Если же вы прибавляете 10 000 - число, которое значимо для хранимого в типе FLOAT числа, - то результатом может быть 100001*Е4.

Даже значения с подходящей точностью числа с плавающей точкой могут не всегда храниться в точном представлении. Такие значения, как 1.93 или даже 123, могут быть представлены в памяти как значения, очень близкие к указанному числу. Эти значения достаточно близки- когда число с плавающей точкой округляется для вывода, оно будет отображать ожидаемое значение, когда оно используется в вычислениях, результат будет очень близким приближением к ожидаемому результату.

Эффект такой: когда вы выполняете какое-либо вычисление, которое должно дать результат 123, оно может быть очень близким приближением к 123. При точных сравнениях (равенство, больше чем, меньше чем и т.д.) между двумя числами с плавающей точкой, между числом с плавающей точкой и нулем или числом с плавающей точкой и числом с фиксированной точкой не следует рассчитывать на ожидаемые результаты.

По этой причине не следует рассматривать использование

столбцов с плавающей точкой в качестве ключей или применять к ним ограничения уникальности. Они не будут работать предсказуемо для отношений внешнего ключа или в объединениях.

Для сравнений проверяйте значения с плавающей точкой в предложении BETWEEN с подходящим диапазоном вместо того, чтобы выполнять точную проверку. Тот же совет применим и для сравнения с нулем - выберите подходящий диапазон значений и запишите проверку данных между нулем и близким к нулю значением или между двумя подходящими значениями, близкими к нулю [23] .

23

Спасибо Джеффу Ворбойзу (Geoff Worboys) за его понятные замечания по этой больной теме.

В базе данных диалекта 1 необходимость хранения значений числовых данных, имеющих больший диапазон, чем предоставляет 32-битовое целое, может быть решена выбором типа DOUBLE PRECISION. Ограничения диалекта 1 также требуют использования чисел с плавающей точкой для всех действительных чисел, если к базе данных предполагается доступ из встроенного приложения (ESQL).

Firebird предоставляет два приближенных числовых типа данных с плавающей точкой (FLOAT и DOUBLE PRECISION), отличающиеся только размером точности.

FLOAT

FLOAT является 32-битовым типом данных с плавающей точкой с приблизительно 7 цифрами точности - для надежности предполагайте 6 цифр. Число с 10 цифрами 25.33333312, добавленное в столбец FLOAT, сохраняется как 25.33333. Диапазон чисел от -3.402 x 10(^38^) до 3.402 x 10(^38^). Наименьшее положительное число, которое может быть сохранено, 1.175 * 10(^-38^).

DOUBLE PRECISION

DOUBLE PRECISION является 64-битовым типом данных с плавающей точкой с приблизительно 15 цифрами точности. Диапазон от -1.797 x 10(^308^) до 1.797 x 10(^308^). Наименьшее положительное число, которое может быть сохранено, 2.225 x 10(^-308^).

Арифметические операции над смешанными типами с фиксированной и плавающей точкой

Когда бинарная операция (сложение, вычитание, умножение и деление) включает в качестве операндов точные числа и числа с плавающей точкой, то результат будет типа DOUBLE PRECISION.

Следующий оператор создает столбец PERCENT_CHANGE, используя тип DOUBLE PRECISION:

CREATE TABLE SALARY_HISTORY

(

. . .

PERCENT_CHANGE DOUBLE PRECISION

DEFAULT О

NOT NULL

CHECK (PERCENT_CHANGE BETWEEN -50 AND 50),

. . .

) ;

Следующий оператор CREATE TABLE дает пример использования различных числовых типов данных: INTEGER для общего количества заказов, с фиксированной точкой DECIMAL для общей суммы продаж в долларах и FLOAT для скидки к продаже:

CREATE TABLE SALES

(. . .

QTY_ORDERED INTEGER

DEFAULT 1

CHECK (QTY_ORDERED >=1),

TOTAL_VALUE DECIMAL (9,2)

Поделиться:
Популярные книги

Цветы сливы в золотой вазе, или Цзинь, Пин, Мэй

Ланьлинский насмешник
Старинная литература:
древневосточная литература
7.00
рейтинг книги
Цветы сливы в золотой вазе, или Цзинь, Пин, Мэй

Кодекс Охотника. Книга XIX

Винокуров Юрий
19. Кодекс Охотника
Фантастика:
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XIX

70 Рублей - 2. Здравствуй S-T-I-K-S

Кожевников Павел
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
постапокалипсис
5.00
рейтинг книги
70 Рублей - 2. Здравствуй S-T-I-K-S

Мастер 3

Чащин Валерий
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 3

Лучше подавать холодным

Аберкромби Джо
4. Земной круг. Первый Закон
Фантастика:
фэнтези
8.45
рейтинг книги
Лучше подавать холодным

Имперец. Земли Итреи

Игнатов Михаил Павлович
11. Путь
Фантастика:
героическая фантастика
боевая фантастика
5.25
рейтинг книги
Имперец. Земли Итреи

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Не грози Дубровскому!

Панарин Антон
1. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому!

Отмороженный 7.0

Гарцевич Евгений Александрович
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Отмороженный 7.0

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Энфис 5

Кронос Александр
5. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 5

Опасная любовь командора

Муратова Ульяна
1. Проклятые луной
Фантастика:
фэнтези
5.00
рейтинг книги
Опасная любовь командора

Найди меня Шерхан

Тоцка Тала
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70
рейтинг книги
Найди меня Шерхан