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

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

Примечание

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

ceil

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

Аналог функции 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─┐
│   123.5 │
└─────────┘

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

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

floor

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

Возвращает наибольшее число, меньшее либо равное 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

Округляет значение до заданного количества знаков после запятой 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 для 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

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

  • Если N > 0, функция округляет вправо от десятичной точки
  • Если N < 0, функция округляет влево от десятичной точки
  • Если N = 0, функция округляет до ближайшего целого числа
Заметки
  • Когда округляемое число находится ровно посередине между двумя значениями, оно округляется до ближайшей чётной цифры на заданной десятичной позиции. Например: 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

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

Синтаксис

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

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

Синтаксис

округлитьДлительность(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.

Синтаксис

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

Аналог функции 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 │
└───────┘