Поведение операций с DECFLOAT
Поведение операций с DECFLOAT
, в частности округление и поведение при ошибках, можно настроить с помощьюоператора управления SET DECFLOAT
.
Типы данных с плавающей точкой
Типы данных с фиксированной точкой
Типы данных для работы с датой и временем
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
установленного для сеанса.
DECFLOAT
и функцииРяд стандартных скалярных функций можно использовать с выражениями и значениями типа DECFLOAT
.Это относится к следующим математическим функциям:
|
|
|
|
|
|
|
|
|
|
Агрегатные функции SUM
, AVG
, MIN
и MAX
тоже работают с типом DECFLOAT
.Все статистические агрегатные функции (такие как STDDEV
или CORR
, но не ограничено ими) могут работать с данными типа DECFLOAT
.
DECFLOAT
Firebird поддерживает 4 функции, которые созданы специально для поддержки типа DECFLOAT
:
COMPARE_DECFLOAT
сравнивает два значения DECFLOAT
как равные, разные или неупорядоченные
NORMALIZE_DECFLOAT
принимает единственный аргумент DECFLOAT
и возвращает его в простейшей форме
QUANTIZE
принимает два аргумента DECFLOAT
и возвращает первый аргумент, масштабированный с использованием второго значения в качестве образца
TOTALORDER
выполняет точное сравнение двух значений DECFLOAT
Замыкающие нули в значениях десятичных чисел с плавающей запятой сохраняются.Например, 1.0 и 1.00 — это два различных представления.Это порождает различные семантики сравнения для типа данных DECFLOAT
, как показано ниже.
Замыкающие нули игнорируются в сравнениях.Например, 1.0 равно 1.00.По умолчанию такой тип сравнения используется для индексирования, сортировки, разбивки таблицы, оценки предикатов и других функций — короче говоря, везде, где сравнение выполняется неявно или в предикатах.
create table stockPrice (stock DECFLOAT(16));
insert into stockPrice
values (4.2);
insert into stockPrice
values (4.2000);
insert into stockPrice
values (4.6125);
insert into stockPrice
values (4.20);
commit;
select * from stockPrice where stock = 4.2;
-- Возвращает три значения 4.2, 4.2000, 4.20
select * from stockPrice where stock > 4.20;
-- Возвращает одно значение 4.6125
select * from stockPrice order by stock;
-- Возвращает все значения, 4.2, 4.2000, 4.20, 4.6125.
-- Первые три значения возвращаются в неопределенном порядке.
Замыкающие нули учитываются при сравнении.Например, 1.0 > 1.00.Каждое значение DECFLOAT
имеет порядок в семантике сравнения TotalOrder.
Согласно семантике TotalOrder, порядок различных значений определяется так, как показано в следующем примере:
-nan < -snan < -inf < -0.1 < -0.10 < -0 < 0 < 0.10 < 0.1 < inf < snan < nan
Important
|
Обратите внимание на то, что отрицательный нуль меньше положительного нуля при сравнении TotalOrder |
Запросить сравнение TotalOrder в предикатах можно при помощи встроенной функции TOTALORDER().
Для курсов акций может быть важным знать точность данных.Например, если курсы обычно указываются с точностью в пять знаков после запятой, а курс равен $4.2, тогда неясно, равна цена $4.2000, $4.2999 или чему-то, лежащему между этими двумя значениями.
create table stockPrice (stock DECFLOAT(16));
insert into stockPrice
values (4.2);
insert into stockPrice
values (4.2000);
insert into stockPrice
values (4.6125);
insert into stockPrice
values (4.20);
commit;
select * from stockPrice where TOTALORDER(stock, 4.2000) = 0;
-- Возвращает только значение 4.2000
select * from stockPrice where TOTALORDER(stock, 4.20) = 1;
-- Возвращает два значения 4.2 и 4.6125, которое больше 4.20
Порядок, в котором возвращаются арифметически одинаковые значения, имеющие различное количество замыкающих нулей, не определен.Следовательно, ORDER BY
по столбцу DECFLOAT
со значениями 1.0 и 1.00 возвращает два значения в произвольном порядке.Аналогично, DISTINCT
возвращает либо 1.0, либо 1.00.