Перейти к основному содержимому
Перейти к основному содержимому

Функции округления

Примечание

Приведённая ниже документация сгенерирована из системной таблицы system.functions

ceil

Добавлено в версии: v1.1.0

Аналог функции floor, но возвращает наименьшее число, округлённое в большую сторону, большее или равное x. Если округление приводит к переполнению (например, ceiling(255, -1)), результат не определён.

Синтаксис

ceiling(x[, N])

Псевдонимы: ceiling

Аргументы

  • x — значение для округления. Float* или Decimal* или (U)Int*
  • N — необязательный параметр. Количество десятичных знаков, до которых нужно округлить. По умолчанию — ноль, то есть округление до целого числа. Может быть отрицательным. (U)Int*

Возвращаемое значение

Возвращает округлённое число того же типа, что и x. Float* или Decimal* или (U)Int*

Примеры

Базовое использование

SELECT ceiling(123.45, 1) AS rounded
┌─rounded─┐
│   123.5 │
└─────────┘

Отрицательная точность

SELECT ceiling(123.45, -1)
┌─ceiling(123.45, -1)─┐
│                 130 │
└─────────────────────┘

floor

Появилась в версии: v1.1.0

Возвращает наибольшее число, не превосходящее x, округлённое таким образом, что результат кратен 1 / 10 * N, либо ближайшее число соответствующего типа данных, если 1 / 10 * N не может быть представлено точно.

Целочисленные аргументы могут быть округлены с отрицательным значением N. При неотрицательном N функция возвращает x.

Если округление приводит к переполнению (например, floor(-128, -1)), результат не определён.

Синтаксис

floor(x[, N])

Аргументы

  • x — Значение для округления. Float* или Decimal* или (U)Int*
  • N — Необязательный параметр. Количество знаков после запятой, до которых выполняется округление. По умолчанию равно нулю, что означает округление до целого числа. Может быть отрицательным. (U)Int*

Возвращаемое значение

Возвращает округлённое число того же типа, что и x. Float* или Decimal* или (U)Int*

Примеры

Пример использования

SELECT floor(123.45, 1) AS rounded
┌─rounded─┐
│   123.4 │
└─────────┘

Отрицательная точность

SELECT floor(123.45, -1)
┌─floor(123.45, -1)─┐
│               120 │
└───────────────────┘

round

Появилась в версии: v1.1.0

Округляет значение до указанного количества десятичных разрядов N.

  • Если N > 0, функция округляет вправо от десятичной точки.
  • Если N < 0, функция округляет влево от десятичной точки.
  • Если N = 0, функция округляет до ближайшего целого числа.

Функция возвращает ближайшее число указанного порядка. Если входное значение равноудалено от двух соседних чисел, для значений типа Float* используется банковское округление, а для остальных числовых типов (Decimal*) — округление от нуля.

Если округление приводит к переполнению (например, round(255, -1)), результат не определён.

Синтаксис

round(x[, N])

Аргументы

  • x — число для округления. Float* или Decimal* или (U)Int*
  • N — необязательный параметр. Количество знаков после запятой, до которых нужно округлить. По умолчанию 0. (U)Int*

Возвращаемое значение

Возвращает округлённое число того же типа, что и x. Float* или Decimal* или (U)Int*

Примеры

Входные данные типа Float

SELECT number / 2 AS x, round(x) FROM system.numbers LIMIT 3;
┌───x─┬─round(x)─┐
│   0 │        0 │
│ 0.5 │        0 │
│   1 │        1 │
└─────┴──────────┘

Десятичные значения

SELECT cast(number / 2 AS  Decimal(10,4)) AS x, round(x) FROM system.numbers LIMIT 3;
┌───x─┬─round(x)─┐
│   0 │        0 │
│ 0.5 │        1 │
│   1 │        1 │
└─────┴──────────┘

roundAge

Появилась в версии: v1.1.0

Принимает число, обозначающее возраст человека, сравнивает его со стандартными возрастными диапазонами и возвращает либо нижнюю, либо верхнюю границу диапазона, в который попадает число.

  • Возвращает 0 при age < 1.
  • Возвращает 17 при 1 ≤ age ≤ 17.
  • Возвращает 18 при 18 ≤ age ≤ 24.
  • Возвращает 25 при 25 ≤ age ≤ 34.
  • Возвращает 35 при 35 ≤ age ≤ 44.
  • Возвращает 45 при 45 ≤ age ≤ 54.
  • Возвращает 55 при age ≥ 55.

Синтаксис

roundAge(num)

Аргументы

  • age — Число, задающее возраст в годах. (U)Int* или Float*

Возвращаемое значение

Возвращает либо верхнюю, либо нижнюю границу возрастного диапазона, в который попадает age. UInt8

Примеры

Пример использования

SELECT *, roundAge(*) FROM system.numbers WHERE number IN (0, 5, 20, 31, 37, 54, 72);
┌─number─┬─roundAge(number)─┐
│      0 │                0 │
│      5 │               17 │
│     20 │               18 │
│     31 │               25 │
│     37 │               35 │
│     54 │               45 │
│     72 │               55 │
└────────┴──────────────────┘

roundBankers

Введена в: v20.1.0

Округляет число до заданного десятичного разряда N. Если округляемое число находится посередине между двумя числами, функция использует метод округления, называемый банковским округлением (banker's rounding), который является методом округления по умолчанию для чисел с плавающей запятой, определённым стандартом IEEE 754.

  • Если N > 0, функция округляет вправо от десятичной точки
  • Если N < 0, функция округляет влево от десятичной точки
  • Если N = 0, функция округляет до ближайшего целого числа
Notes
  • Когда округляемое число находится посередине между двумя числами, округление производится к ближайшей чётной цифре на заданной десятичной позиции. Например: 3.5 округляется вверх до 4, 2.5 округляется вниз до 2.
  • Функция round выполняет такое же округление для чисел с плавающей запятой.
  • Функция roundBankers также округляет целые числа аналогичным образом, например, roundBankers(45, -1) = 40.
  • В остальных случаях функция округляет числа до ближайшего целого.
Используйте банковское округление при суммировании или вычитании чисел

Используя банковское округление, вы можете уменьшить влияние округления чисел на результаты их суммирования или вычитания.

Например, просуммируйте числа 1.5, 2.5, 3.5, 4.5 с различными методами округления:

  • Без округления: 1.5 + 2.5 + 3.5 + 4.5 = 12.
  • Банковское округление: 2 + 2 + 4 + 4 = 12.
  • Округление до ближайшего целого: 2 + 3 + 4 + 5 = 14.

Синтаксис

roundBankers(x[, N])

Аргументы

  • x — Число для округления. (U)Int* или Decimal* или Float*
  • [, N] — Необязательный параметр. Количество знаков после запятой, до которых нужно округлить. По умолчанию 0. (U)Int*

Возвращаемое значение

Возвращает значение, округлённое методом банковского округления. (U)Int* или Decimal* или Float*

Примеры

Базовое использование

SELECT number / 2 AS x, roundBankers(x, 0) AS b FROM system.numbers LIMIT 10
┌───x─┬─b─┐
│   0 │ 0 │
│ 0.5 │ 0 │
│   1 │ 1 │
│ 1.5 │ 2 │
│   2 │ 2 │
│ 2.5 │ 2 │
│   3 │ 3 │
│ 3.5 │ 4 │
│   4 │ 4 │
│ 4.5 │ 4 │
└─────┴───┘

roundDown

Появилась в версии: v20.1.0

Округляет число вниз до элемента в указанном массиве. Если значение меньше нижней границы массива, возвращается нижняя граница.

Синтаксис

roundDown(num, arr)

Аргументы

  • num — Число, которое нужно округлить в меньшую сторону. (U)Int* или Decimal* или Float*
  • arr — Массив элементов, к которым нужно округлить num в меньшую сторону. Array((U)Int*) или Array(Float*)

Возвращаемое значение

Возвращает число, округлённое в меньшую сторону до элемента из arr. Если значение меньше нижней границы, возвращается нижняя граница. (U)Int* или Float*

Примеры

Пример использования

SELECT *, roundDown(*, [3, 4, 5]) FROM system.numbers WHERE number IN (0, 1, 2, 3, 4, 5)
┌─number─┬─roundDown(number, [3, 4, 5])─┐
│      0 │                            3 │
│      1 │                            3 │
│      2 │                            3 │
│      3 │                            3 │
│      4 │                            4 │
│      5 │                            5 │
└────────┴──────────────────────────────┘

roundDuration

Добавлено в: v1.1.0

Округляет число вниз до ближайшего значения из набора типичных длительностей: 1, 10, 30, 60, 120, 180, 240, 300, 600, 1200, 1800, 3600, 7200, 18000, 36000. Если число меньше единицы, функция возвращает 0.

Синтаксис

roundDuration(num)

Аргументы

  • num — число, которое нужно округлить до одного из типичных интервалов времени. (U)Int* или Float*

Возвращаемое значение

Возвращает 0, если num < 1. В противном случае — одно из следующих значений: 1, 10, 30, 60, 120, 180, 240, 300, 600, 1200, 1800, 3600, 7200, 18000, 36000. UInt16

Примеры

Пример использования

SELECT *, roundDuration(*) FROM system.numbers WHERE number IN (0, 9, 19, 47, 101, 149, 205, 271, 421, 789, 1423, 2345, 4567, 9876, 24680, 42573)
┌─number─┬─roundDuration(number)─┐
│      0 │                     0 │
│      9 │                     1 │
│     19 │                    10 │
│     47 │                    30 │
│    101 │                    60 │
│    149 │                   120 │
│    205 │                   180 │
│    271 │                   240 │
│    421 │                   300 │
│    789 │                   600 │
│   1423 │                  1200 │
│   2345 │                  1800 │
│   4567 │                  3600 │
│   9876 │                  7200 │
│  24680 │                 18000 │
│  42573 │                 36000 │
└────────┴───────────────────────┘

roundToExp2

Впервые появилась в версии: v1.1.0

Округляет число в меньшую сторону до ближайшей (целой неотрицательной) степени двойки. Если число меньше единицы, возвращает 0.

Синтаксис

roundToExp2(num)

Аргументы

  • num — число для округления. (U)Int* или Float*

Возвращаемое значение

Возвращает num, округлённое вниз до ближайшей (целой неотрицательной) степени двойки, в противном случае — 0 для num < 1. (U)Int* или Float*

Примеры

Пример использования

SELECT *, roundToExp2(*) FROM system.numbers WHERE number IN (0, 2, 5, 10, 19, 50)
┌─number─┬─roundToExp2(number)─┐
│      0 │                   0 │
│      2 │                   2 │
│      5 │                   4 │
│     10 │                   8 │
│     19 │                  16 │
│     50 │                  32 │
└────────┴─────────────────────┘

trunc

Введена в версии: v1.1.0

Аналог функции floor, но возвращает округлённое число с наибольшим абсолютным значением, меньшим либо равным абсолютному значению x.

Синтаксис

truncate(x[, N])

Псевдонимы: truncate

Аргументы

  • x — значение для округления. Float* или Decimal* или (U)Int*
  • N — необязательный аргумент. Количество знаков после запятой, до которых нужно округлить. По умолчанию — ноль, что означает округление до целого числа. (U)Int*

Возвращаемое значение

Возвращает округлённое число того же типа, что и x. Float* или Decimal* или (U)Int*

Примеры

Базовое использование

SELECT truncate(123.499, 1) AS res;
┌───res─┐
│ 123.4 │
└───────┘