跳到主要内容
跳到主要内容

舍入函数

注意

以下文档由 system.functions 系统表生成

ceil

引入版本:v1.1

类似于 floor,但返回大于或等于 x 的最小舍入值。 如果舍入导致溢出(例如 ceiling(255, -1)),结果未定义。

语法

ceiling(x[, N])

别名: ceiling

参数

  • x — 要进行舍入的值。Float*Decimal*(U)Int*
  • N — 可选。要舍入到的小数位数。默认值为 0,表示舍入为整数。可以为负数。(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

返回小于或等于 x 的最大舍入值,其中该值是 1 / 10 * N 的倍数;如果 1 / 10 * N 不是精确值,则返回该数据类型中与其最接近的数值。

N 为负数时,整数参数也会被舍入。 当 N 为非负数时,函数返回 x 本身。

如果舍入导致溢出(例如,floor(-128, -1)),结果未定义。

语法

floor(x[, N])

参数

  • x — 要进行取整的值。Float*Decimal*(U)Int*
  • N — 可选。要舍入到的小数位数。默认为 0,即舍入为整数。可以为负数。(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*

示例

浮点类型输入

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

接收一个表示人的年龄的数字,将其与标准年龄区间进行比较,并返回该数字所在区间的最小值或最大值。

  • age < 1 时,返回 0
  • 1 ≤ age ≤ 17 时,返回 17
  • 18 ≤ age ≤ 24 时,返回 18
  • 25 ≤ age ≤ 34 时,返回 25
  • 35 ≤ age ≤ 44 时,返回 35
  • 45 ≤ age ≤ 54 时,返回 45
  • age ≥ 55 时,返回 55

语法

roundAge(num)

参数

返回值

返回 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,函数会舍入到最接近的整数
Notes
  • 当要舍入的数正好位于两个数的中间时,会在指定的小数位舍入到最近的偶数字。 例如:3.5 舍入为 42.5 舍入为 2
  • round 函数对浮点数执行相同的舍入方式。
  • roundBankers 函数对整数也采用相同的舍入方式,例如,roundBankers(45, -1) = 40
  • 在其他情况下,函数将数字舍入到最近的整数。
Use banker's rounding for summation or subtraction of numbers

使用银行家舍入可以减小对这些数字进行舍入时对求和或求差结果的影响。

例如,对数字 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])

参数

返回值

返回按银行家舍入法得到的舍入结果。(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)

参数

返回值

返回向下取整后与 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。 如果数字小于 1,则返回 0

语法

roundDuration(num)

参数

  • num — 要舍入到常用持续时间集合中某个值的数值。(U)Int*Float*

返回值

num < 1 时返回 0。否则返回下列值之一:1, 10, 30, 60, 120, 180, 240, 300, 600, 1200, 1800, 3600, 7200, 18000, 36000UInt16

示例

使用示例

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

将数字向下舍入到最近的(非负整数)2 的整数次幂。 如果数字小于 1,则返回 0

语法

roundToExp2(num)

参数

返回值

返回将 num 向下取为距离它最近的(非负的)2 的整数次幂;对于 num < 1,返回 0(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 — 可选。要舍入到的小数位数。默认值为 0,表示舍入为整数。(U)Int*

返回值

返回一个与 x 类型相同的舍入后数值。Float*Decimal*(U)Int*

示例

基本用法

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