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

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

floor

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

Примеры

Запрос:

SELECT floor(123.45, 1) AS rounded

Результат:

┌─rounded─┐
│   123.4 │
└─────────┘

Запрос:

SELECT floor(123.45, -1)

Результат:

┌─rounded─┐
│     120 │
└─────────┘

ceiling

Как floor, но возвращает наименьшее округленное число, большее или равное x.

Синтаксис

ceiling(x[, N])

Псевдоним: ceil

truncate

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

Синтаксис

truncate(x[, N])

Псевдоним: trunc.

Пример

Запрос:

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

round

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

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

Синтаксис

round(x[, N])

Аргументы

  • x — Число для округления. Float*, Decimal* или (U)Int*.
  • N — Число десятичных знаков для округления. Целое. По умолчанию равно 0.
    • Если N > 0, функция округляет вправо от десятичной точки.
    • Если N < 0, функция округляет влево от десятичной точки.
    • Если N = 0, функция округляет до ближайшего целого числа.

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

Округленное число того же типа, что и x.

Примеры

Пример с входными данными типа Float:

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

Пример с входными данными типа Decimal:

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

Чтобы сохранить конечные нули, включите настройку output_format_decimal_trailing_zeros:

SELECT cast(number / 2 AS  Decimal(10,4)) AS x, round(x) FROM system.numbers LIMIT 3 settings output_format_decimal_trailing_zeros=1;

┌──────x─┬─round(CAST(divide(number, 2), 'Decimal(10, 4)'))─┐
│ 0.0000 │                                           0.0000 │
│ 0.5000 │                                           1.0000 │
│ 1.0000 │                                           1.0000 │
└────────┴──────────────────────────────────────────────────┘

Примеры округления до ближайшего числа:

round(3.2, 0) = 3
round(4.1267, 2) = 4.13
round(22,-1) = 20
round(467,-2) = 500
round(-467,-2) = -500

Банковское округление.

round(3.5) = 4
round(4.5) = 4
round(3.55, 1) = 3.6
round(3.65, 1) = 3.6

Смотрите также

roundBankers

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

Если число округления находится на половине между двумя числами, функция использует банковское округление. Банковское округление — это метод округления дробных чисел. Когда число округления находится на половине между двумя числами, оно округляется до ближайшей четной цифры на заданной десятичной позиции. Например: 3.5 округляется до 4, 2.5 округляется до 2. Это метод округления по умолчанию для чисел с плавающей запятой, определенный в IEEE 754. Функция 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])

Аргументы

  • N > 0 — Функция округляет число до заданной позиции вправо от десятичной точки. Пример: roundBankers(3.55, 1) = 3.6.

  • N < 0 — Функция округляет число до заданной позиции влево от десятичной точки. Пример: roundBankers(24.55, -1) = 20.

  • N = 0 — Функция округляет число до целого. В этом случае аргумент можно опустить. Пример: roundBankers(2.5) = 2.

  • x — Число для округления. Float*, Decimal* или (U)Int*.

  • N — Число десятичных знаков для округления. Целое. По умолчанию равно 0.

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

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

Значение, округленное методом банковского округления.

Примеры

Запрос:

 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 │
└─────┴───┘

Примеры банковского округления:

roundBankers(0.4) = 0
roundBankers(-3.5) = -4
roundBankers(4.5) = 4
roundBankers(3.55, 1) = 3.6
roundBankers(3.65, 1) = 3.6
roundBankers(10.35, 1) = 10.4
roundBankers(10.755, 2) = 10.76

Смотрите также

roundToExp2

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

Синтаксис

roundToExp2(num)

Параметры

  • num: Число для округления. UInt/Float.

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

  • 0, для num <1\lt 1. UInt8.
  • num, округленный вниз до ближайшей (целой неположительной) степени двойки. UInt/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 │
└────────┴─────────────────────┘

roundDuration

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

Синтаксис

roundDuration(num)

Параметры

  • num: Число для округления до одного из чисел в наборе распространенных длительностей. UInt/Float.

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

  • 0, для num <1\lt 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 │
└────────┴───────────────────────┘

roundAge

Принимает число в рамках различных распространенных диапазонов человеческого возраста и возвращает максимум или минимум в этом диапазоне.

Синтаксис

roundAge(num)

Параметры

  • age: Число, представляющее возраст в годах. UInt/Float.

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

  • Возвращает 0, для age<1age \lt 1.
  • Возвращает 17, для 1age171 \leq age \leq 17.
  • Возвращает 18, для 18age2418 \leq age \leq 24.
  • Возвращает 25, для 25age3425 \leq age \leq 34.
  • Возвращает 35, для 35age4435 \leq age \leq 44.
  • Возвращает 45, для 45age5445 \leq age \leq 54.
  • Возвращает 55, для age55age \geq 55.

Тип: 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 │
└────────┴──────────────────┘

roundDown

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

Синтаксис

roundDown(num, arr)

Параметры

  • num: Число для округления вниз. Numeric.
  • arr: Массив элементов, до которых округляется age. Array типа UInt/Float.

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

  • Число, округленное вниз до элемента в arr. Если значение меньше нижнего предела, возвращается нижний предел. UInt/Float тип, выведенный из типа arr.

Пример

Запрос:

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 │
└────────┴──────────────────────────────┘