FirebirdSQL logo
 Структура языка SQLОбщие элементы языка 

Десятичные типы с плавающей точкой

Начиная с Firebird 4.0 поддерживаются типы десятичных чисел с плавающей запятой.

DECFLOAT

DECFLOAT является числовым типом из стандарта SQL:2016, который точно хранитчисла с плавающей запятой. В отличие от DECFLOAT типы FLOAT или DOUBLE PRECISIONобеспечивают двоичное приближение предполагаемой точности.

Firebird в соответствии со стандартом IEEE 754-1985 (IEEE 754-2008) реализует типыDECIMAL64 (DECFLOAT(16)) и DECIMAL128 (DECFLOAT(34)).

Все промежуточные вычисления осуществляются с использованием 34-значнымизначениями.

16-значное и 34-значное

“16” и “34” относятся к максимальной точности десятичных цифр.

Синтаксис
DECFLOAT[(precision)]

precision ::= 16 | 34
Table 1. Диапазон значений DECFLOAT
Тип Максимальная точность Минимальная экспонента Максимальная экспонента Наименьшее значение Наибольшее значение

DECFLOAT(16)

16

-383

+384

1E-398

9.9..9E+384

DECFLOAT(34)

34

-6143

+6144

1E-6176

9.9..9E+6144

Обратите внимание, что хотя наименьший показатель степени для DECFLOAT (16) равен -383, наименьшее значение имеет показатель степени -398, что на 15 цифр меньше.И аналогично для DECFLOAT (34), наименьший показатель степени равен -6143, но наименьшее значение имеет показатель степени -6176, что на 33 цифры меньше.Причина заключается в том, что точность была “принесена в жертву”, чтобы можно было хранить меньшее значение.

Это результат того, как хранится значение: как десятичное значение из 16 или 34 цифр и показатель степени.Например, 1.234567890123456e-383 фактически сохраняется как коэффициент 1234567890123456 и показатель степени -3981E-398 сохраняется как коэффициент 1, показатель степени -398.

Тип DECFLOAT следует использовать если вам необходимы вычисления и хранение чисел с большой точностью.

Example 1. Использование типа DECFLOAT при определении таблицы
CREATE TABLE StockPrice (
  id    INT NOT NULL PRIMARY KEY,
  stock DECFLOAT(16),
  ...
);
Example 2. Использование типа DECFLOAT в PSQL
DECLARE VARIABLE v DECFLOAT(34);
Поведение операций с DECFLOAT

Поведение операций с DECFLOAT, в частности округление и поведение при ошибках, можно настроить с помощьюоператора управления SET DECFLOAT.

Длина литералов DECFLOAT

Значение типа DECFLOAT можно задать числовым литералом в научной нотации, только еслимантисса состоит из 20 или более цифр, или абсолютный показатель степени больше 308. В противном случае такие литералыинтерпретируются как DOUBLE PRECISION. Точные числовые литералы с 40 или более цифрами — фактически 39 цифр, если они больше максимального значения INT128 также обрабатываются как DECFLOAT (34).

В качестве альтернативы можно использовать строковый литерал и явно привести к желаемому типу DECFLOAT.

Длина литералов типа DECFLOAT ограничена 1024 символами.Для более длинных значений вам придётся использовать научную нотацию.Например, значение 0.0<1020 zeroes>11 не может быть записано как литерал, вместо него вы можете использовать аналогичную научную нотацию: 1.1E-1022.Аналогично 10<1022 zeroes>0 может быть записано как 1.0E1024.

Литералы, содержащие более 34 значащих цифр, округляются с использованием режима округления DECFLOAT установленного для сеанса.