Rounding
Rounding functions reference.
ceil
Like floor but returns the smallest rounded number greater than or equal to x.
If rounding causes an overflow (for example, ceiling(255, -1)), the result is undefined.
Syntax
ceiling(x[, N])Arguments
x— The value to round.Float*orDecimal*or(U)Int*N— Optional. The number of decimal places to round to. Defaults to zero, which means rounding to an integer. Can be negative.(U)Int*
Returned value
Returns a rounded number of the same type as x. Float* or Decimal* or (U)Int*
Examples
Basic usage
SELECT ceiling(123.45, 1) AS rounded┌─rounded─┐
│ 123.5 │
└─────────┘Negative precision
SELECT ceiling(123.45, -1)┌─ceiling(123.45, -1)─┐
│ 130 │
└─────────────────────┘Introduced in version 1.1.
floor
Returns the largest rounded number less than or equal to x, where the rounded number is a multiple of 1 / 10 * N, or the nearest number of the appropriate data type if 1 / 10 * N isn't exact.
Integer arguments may be rounded with a negative N argument.
With non-negative N the function returns x.
If rounding causes an overflow (for example, floor(-128, -1)), the result is undefined.
Syntax
floor(x[, N])Arguments
x— The value to round.Float*orDecimal*or(U)Int*N— Optional. The number of decimal places to round to. Defaults to zero, which means rounding to an integer. Can be negative.(U)Int*
Returned value
Returns a rounded number of the same type as x. Float* or Decimal* or (U)Int*
Examples
Usage example
SELECT floor(123.45, 1) AS rounded┌─rounded─┐
│ 123.4 │
└─────────┘Negative precision
SELECT floor(123.45, -1)┌─floor(123.45, -1)─┐
│ 120 │
└───────────────────┘Introduced in version 1.1.
round
Rounds a value to a specified number of decimal places N.
- If
N > 0, the function rounds to the right of the decimal point. - If
N < 0, the function rounds to the left of the decimal point. - If
N = 0, the function rounds to the next integer.
The function returns the nearest number of the specified order.
If the input value has equal distance to two neighboring numbers, the function uses banker's rounding for Float* inputs and rounds away from zero for the other number types (Decimal*).
If rounding causes an overflow (for example, round(255, -1)), the result is undefined.
Syntax
round(x[, N])Arguments
x— A number to round.Float*orDecimal*or(U)Int*N— Optional. The number of decimal places to round to. Defaults to0.(U)Int*
Returned value
Returns a rounded number of the same type as x. Float* or Decimal* or (U)Int*
Examples
Float inputs
SELECT number / 2 AS x, round(x) FROM system.numbers LIMIT 3;┌───x─┬─round(x)─┐
│ 0 │ 0 │
│ 0.5 │ 0 │
│ 1 │ 1 │
└─────┴──────────┘Decimal inputs
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 │
└─────┴──────────┘Introduced in version 1.1.
roundAge
Takes a number representing a human age, compares it to standard age ranges, and returns either the highest or lowest value of the range the number falls within.
- Returns
0, forage < 1. - Returns
17, for1 ≤ age ≤ 17. - Returns
18, for18 ≤ age ≤ 24. - Returns
25, for25 ≤ age ≤ 34. - Returns
35, for35 ≤ age ≤ 44. - Returns
45, for45 ≤ age ≤ 54. - Returns
55, forage ≥ 55.
Syntax
roundAge(num)Arguments
Returned value
Returns either the highest or lowest age of the range age falls within. UInt8
Examples
Usage example
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 │
└────────┴──────────────────┘Introduced in version 1.1.
roundBankers
Rounds a number to a specified decimal position N.
If the rounding number is halfway between two numbers, the function uses a method of rounding called banker's rounding, which is the default rounding method for floating point numbers defined in IEEE 754.
- If
N > 0, the function rounds to the right of the decimal point - If
N < 0, the function rounds to the left of the decimal point - If
N = 0, the function rounds to the next integer
:::info Notes
- When the rounding number is halfway between two numbers, it's rounded to the nearest even digit at the specified decimal position.
For example:
3.5rounds up to4,2.5rounds down to2. - The
roundfunction performs the same rounding for floating point numbers. - The
roundBankersfunction also rounds integers the same way, for example,roundBankers(45, -1) = 40. - In other cases, the function rounds numbers to the nearest integer. :::
:::tip Use banker's rounding for summation or subtraction of numbers Using banker's rounding, you can reduce the effect that rounding numbers has on the results of summing or subtracting these numbers.
For example, sum numbers 1.5, 2.5, 3.5, 4.5 with different rounding:
- No rounding:
1.5 + 2.5 + 3.5 + 4.5 = 12. - Banker's rounding:
2 + 2 + 4 + 4 = 12. - Rounding to the nearest integer:
2 + 3 + 4 + 5 = 14. :::
Syntax
roundBankers(x[, N])Arguments
x— A number to round.(U)Int*orDecimal*orFloat*[, N]— Optional. The number of decimal places to round to. Defaults to0.(U)Int*
Returned value
Returns a value rounded by the banker's rounding method. (U)Int* or Decimal* or Float*
Examples
Basic usage
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 │
└─────┴───┘Introduced in version 20.1.
roundDown
Rounds a number down to an element in the specified array. If the value is less than the lower bound, the lower bound is returned.
Syntax
roundDown(num, arr)Arguments
num— A number to round down.(U)Int*orDecimal*orFloat*arr— Array of elements to roundnumdown to.Array((U)Int*)orArray(Float*)
Returned value
Returns a number rounded down to an element in arr. If the value is less than the lowest bound, the lowest bound is returned. (U)Int* or Float*
Examples
Usage example
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 │
└────────┴──────────────────────────────┘Introduced in version 20.1.
roundDuration
Rounds a number down to the closest from a set of commonly used durations: 1, 10, 30, 60, 120, 180, 240, 300, 600, 1200, 1800, 3600, 7200, 18000, 36000.
If the number is less than one, it returns 0.
Syntax
roundDuration(num)Arguments
Returned value
Returns 0, for num < 1. Otherwise, one of: 1, 10, 30, 60, 120, 180, 240, 300, 600, 1200, 1800, 3600, 7200, 18000, 36000. UInt16
Examples
Usage example
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 │
└────────┴───────────────────────┘Introduced in version 1.1.
roundToExp2
Rounds a number down to the nearest (whole non-negative) power of two.
If the number is less than one, it returns 0.
Syntax
roundToExp2(num)Arguments
Returned value
Returns num rounded down to the nearest (whole non-negative) power of two, otherwise 0 for num < 1. (U)Int* or Float*
Examples
Usage example
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 │
└────────┴─────────────────────┘Introduced in version 1.1.
trunc
Like floor but returns the rounded number with the largest absolute value less than or equal to that of x.
Syntax
truncate(x[, N])Arguments
x— The value to round.Float*orDecimal*or(U)Int*N— Optional. The number of decimal places to round to. Defaults to zero, which means rounding to an integer.(U)Int*
Returned value
Returns a rounded number of the same type as x. Float* or Decimal* or (U)Int*
Examples
Basic usage
SELECT truncate(123.499, 1) AS res;┌───res─┐
│ 123.4 │
└───────┘Introduced in version 1.1.