跳至主要内容
跳至主要内容

Rounding functions

注意

The documentation below is generated from the system.functions system table

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
┌─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*

示例

浮点数输入

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 — 表示年龄的数字(以年为单位)。 (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。如果四舍五入的数字介于两个数字之间,则该函数使用一种称为银行家舍入法的方法,这是 IEEE 754 中定义的浮点数的默认舍入方法。

  • 如果 N > 0,则该函数四舍五入到小数点右侧
  • 如果 N < 0,则该函数四舍五入到小数点左侧
  • 如果 N = 0,则该函数四舍五入到下一个整数
注意事项
  • 当四舍五入的数字介于两个数字之间时,它会四舍五入到指定十进制位置的最近的偶数数字。例如:3.5 四舍五入到 42.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)

参数

返回值

返回向下四舍五入到 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

语法

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 的幂。如果该数字小于一,则返回 0

语法

roundToExp2(num)

参数

返回值

返回向下四舍五入到最接近的(整数非负)2 的幂的 num,否则对于 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 — 可选。要四舍五入的小数位数。默认为零,这意味着四舍五入到整数。 (U)Int*

返回值

返回与 x 相同类型的四舍五入数字。 Float*Decimal*(U)Int*

示例

基本用法

SELECT truncate(123.499, 1) AS res;
┌───res─┐
│ 123.4 │
└───────┘
    © . This site is unofficial and not affiliated with ClickHouse, Inc.