FirebirdSQL logo

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.