Точность арифметических операций
Функции MIN
, MAX
, SUM
, AVG
работают со всеми точными числовыми типами.SUM
и AVG
являются точными, если обрабатываемая запись имеет точный числовой тип, а масштабированная сумма соответствует 64 или 128 битам: в противном случае возникает исключение переполнения.SUM
и AVG
никогда не вычисляются с использованием арифметики с плавающей запятой, если тип данных столбца не является приблизительным числом.
Функции MIN
и MAX
для точного числового столбца возвращают точный числовой результат, имеющий ту же точность и масштаб, что и столбец.SUM
и AVG
для точного числового типа возвращает результат типа NUMERIC ({18 | 38}, S)
или DECIMAL ({18 | 38}, S)
, где S - масштаб столбца.Стандарт SQL определяет масштаб результата в таких случаях, в то время как точность SUM или AVG для столбцов с фиксированной точкой определяется реализацией: мы определяем его как 18 или 38 (если точность аргумента 18 или 38).
Если два операнда OP1 и OP2 являются точными числами с масштабами S1 и S2 соответственно, то OP1 + OP2
и OP1 - OP2
являются точными числами с точностью 18 или 38 (если один из аргументов с точностью 38) и масштабом равному наибольшему из значений S1 и S2, тогда как для OP1 * OP2
и OP1 / OP2
являются точными числами с точностью 18 или 38 (если точность аргументов 18 или 38) и шкалой S1 + S2
.Масштабы этих операций, кроме разделения, определяются стандартом SQL.Точность всех этих операций и масштаб при делении стандартом не регламентируются, а определяются реализацией: Firebird определяет точность как 18 или 38 (если точность аргументов 18 или 38), а масштаб деления как S1 + S2
, такой же, что определён стандартом в для умножения.
Всякий раз, когда выполняется арифметические операции с точными числовыми типами, в случае потери точности будет сообщено об ошибке переполнения, а не возвращено неправильное значение. Например, если столбец DECIMAL (18,4)
содержит наиболее отрицательное значение этого типа, -922337203685477.5808, попытка разделить этот столбец на -1 будет сообщать об ошибке переполнения, поскольку истинный результат превышает наибольшее положительное значение, которое может быть представлено в типе, а именно 922337203685477.5807.
Если один операнд является точным числом, а другой приблизительным числом, то результатом любого из четырёх диадических операторов будет типа DOUBLE PRECISION
.(В стандарте говорится, что результат является приблизительным числом с точностью, по крайней мере, такой же как точность приблизительного числового операнда: Firebird удовлетворяет этому требованию, всегда используя DOUBLE PRECISION
, поскольку этот тип является максимальным приблизительным числовым типом, который предоставлен в Firebird.)