Десятичные типы с плавающей точкой
Начиная с Firebird 4.0 поддерживаются типы десятичных чисел с плавающей запятой.
Типы данных с плавающей точкой
Типы данных с фиксированной точкой
Типы данных для работы с датой и временем
Начиная с 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” относятся к максимальной точности десятичных цифр.
См. https://ru.wikipedia.org/wiki/IEEE_754-2008#Основные_и_взаимозаменяемые_форматы для получения подробного описания.
DECFLOAT[(precision)] precision ::= 16 | 34
Тип | Максимальная точность | Минимальная экспонента | Максимальная экспонента | Наименьшее значение | Наибольшее значение |
---|---|---|---|---|---|
|
16 |
-383 |
+384 |
1E-398 |
9.9..9E+384 |
|
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
и показатель степени -398
,а 1E-398
сохраняется как коэффициент 1
, показатель степени -398
.
Тип DECFLOAT
следует использовать если вам необходимы вычисления и хранение чисел с большой точностью.
DECFLOAT
при определении таблицыCREATE TABLE StockPrice (
id INT NOT NULL PRIMARY KEY,
stock DECFLOAT(16),
...
);
DECFLOAT
в PSQLDECLARE 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
установленного для сеанса.