DECFLOAT
DECFLOAT
является числовым типом из стандарта SQL:2016, который точно хранитчисла с плавающей запятой. В отличие от DECFLOAT
типы FLOAT
или DOUBLE PRECISION
обеспечивают двоичное приближение предполагаемой точности.
Firebird в соответствии со стандартом IEEE 754-1985 (IEEE 754-2008) реализует типыDECIMAL64
(DECFLOAT(16)
) и DECIMAL128
(DECFLOAT(34)
).
Все промежуточные вычисления осуществляются с использованием 34-значнымизначениями.
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);