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

舍入函数

floor

返回小于或等于 x 的最大舍入数。舍入数是 1 / 10 * N 的倍数,如果 1 / 10 * N 不精确,则返回最接近的适当数据类型的数字。

整数参数可以使用负数 N 参数进行舍入,使用非负数 N 函数返回 x,即不执行任何操作。

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

语法

floor(x[, N])

参数

返回值

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

接受一个数字。如果该数字小于 1,则返回 0。否则,它将数字向下舍入到最接近的(非负整数)2 的幂。

语法

roundToExp2(num)

参数

返回值

  • 0, 对于 num <1\lt 1UInt8
  • num 向下舍入到最接近的(非负整数)2 的幂。 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

接受一个数字。如果该数字小于 1,则返回 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, 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 │
└────────┴───────────────────────┘

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: 要向下舍入的数字。 数值型
  • arr: 要将 age 向下舍入到的元素数组。 数组,类型为 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 │
└────────┴──────────────────────────────┘