算术函数
概述
算术函数适用于任意两个 UInt8
、UInt16
、UInt32
、UInt64
、Int8
、Int16
、Int32
、Int64
、Float32
或 Float64
类型的操作数。
在执行操作之前,两个操作数都会被转换为结果类型。结果类型的确定如下(除非在下面的函数文档中另有说明):
- 如果两个操作数的位数都不超过 32 位,则结果类型的大小将是两个操作数中较大者的下一个较大类型的大小(整数大小提升)。例如,
UInt8 + UInt16 = UInt32
或Float32 * Float32 = Float64
。 - 如果其中一个操作数的位数为 64 或更多,则结果类型的大小将与较大操作数的大小相同。例如,
UInt32 + UInt128 = UInt128
或Float32 * Float64 = Float64
。 - 如果其中一个操作数是有符号的,则结果类型也将是有符号的,否则将是无符号的。例如,
UInt32 * Int32 = Int64
。
这些规则确保结果类型将是可以表示所有可能结果的最小类型。虽然这在值范围边界周围引入了溢出的风险,但它确保计算是使用最大原生整数宽度(64 位)快速执行的。这种行为还确保与许多其他提供 64 位整数(BIGINT)作为最大整数类型的数据库兼容。
示例:
溢出与 C++ 中的处理方法相同。
abs
引入于:v1.1
计算 x
的绝对值。如果 x
是无符号类型则无效。如果 x
是有符号类型,则返回无符号数。
语法
参数
x
— 计算绝对值的值
返回值
x
的绝对值
示例
使用示例
byteSwap
引入于:v23.10
反转整数的字节,即更改其 字节序。
如下示例可以这样处理:
- 将十进制整数字转换为其等效的大端格式的十六进制格式,即 3351772109 -> C7 C7 FB CD(4 字节)
- 反转字节,即 C7 C7 FB CD -> CD FB C7 C7
- 将结果假设为大端格式转换回整数,即 CD FB C7 C7 -> 3455829959 该函数的一个用例是反转 IPv4:
语法
参数
x
— 整数值。(U)Int*
返回值
返回字节反转后的 x
。(U)Int*
示例
使用示例
8位
16位
32位
64位
divide
引入于:v1.1
计算两个值 a
和 b
的商。结果类型始终为 Float64。
整数除法由 intDiv
函数提供。
除以 0
会返回 inf
、-inf
或 nan
。
语法
参数
x
— 被除数 -y
— 除数
返回值
x
和 y
的商
示例
除以两个数字
除以零
divideDecimal
引入于:v22.12
对两个十进制数进行除法运算。结果值的类型将是 Decimal256。
结果规模可以通过 result_scale
参数显式指定(范围为 [0, 76]
的常量整数)。如果没有指定,结果规模为给定参数的最大规模。
这些函数的工作速度显著慢于常规的 divide
。
如果您真的不需要受控精度和/或需要快速计算,考虑使用 divide。
语法
参数
返回值
具有给定规模的除法结果。Decimal256
示例
示例 1
示例 2
divideOrNull
引入于:v25.5
与 divide
相同,但在除以零时返回 NULL。
语法
参数
x
— 被除数 -y
— 除数
返回值
x
和 y
的商,或者 NULL。
示例
除以零
gcd
引入于:v1.1
返回两个值 a
和 b
的最大公约数。
除以零或将最小负数除以 -1 会引发异常。
语法
参数
x
— 第一个整数 -y
— 第二个整数
返回值
x
和 y
的最大公约数。
示例
使用示例
ifNotFinite
引入于:v20.3
检查浮点值是否为有限值。
您可以通过使用 三元操作符 获得类似的结果:isFinite(x) ? x : y
。
语法
参数
返回值
- 如果
x
是有限的,则返回x
。 - 如果
x
不是有限的,则返回y
。
示例
使用示例
intDiv
引入于:v1.1
对两个值 x
除以 y
进行整数除法。换句话说,它计算向下取整到下一个最小整数的商。
结果的宽度与被除数(第一个参数)相同。
除以零、商不适合被除数范围或将最小负数除以 -1 会引发异常。
语法
参数
x
— 左操作数。 -y
— 右操作数。
返回值
x
和 y
的整数除法结果
示例
两个浮点数的整数除法
商不适合被除数的范围
intDivOrNull
引入于:v25.5
与 intDiv
相同,但在除以零或将最小负数除以 -1 时返回 NULL。
语法
参数
返回值
x
和 y
的整数除法结果,或 NULL。
示例
整数除法除以零
将最小负数除以 -1
intDivOrZero
引入于:v1.1
与 intDiv
相同,但在除以零或将最小负数除以 -1 时返回零。
语法
参数
返回值
a
和 b
的整数除法结果,或零。
示例
整数除法除以零
将最小负数除以 -1
isFinite
引入于:v1.1
如果 Float32 或 Float64 参数不是无限大且不是 NaN
,则返回 1
,否则此函数返回 0
。
语法
参数
x
— 要检查是否为有限值的数字。Float*
返回值
如果 x
不是无限的且不是 NaN
,则返回 1
,否则返回 0
。
示例
测试一个数字是否有限
isInfinite
引入于:v1.1
如果 Float32 或 Float64 参数是无限的,则返回 1
,否则此函数返回 0
。
请注意,对于 NaN
返回 0
。
语法
参数
x
— 要检查是否为无限大的数字。Float*
返回值
如果 x
是无限的,则返回 1
,否则返回 0
(包括对于 NaN
)。
示例
测试一个数字是否是无限的
isNaN
引入于:v1.1
如果 Float32 和 Float64 参数是 NaN
,则返回 1
,否则返回 0
。
语法
参数
x
— 要评估其是否为NaN
的参数。Float*
返回值
如果是 NaN
,则返回 1
,否则返回 0
示例
使用示例
lcm
引入于:v1.1
返回两个值 x
和 y
的最小公倍数。
除以零或将最小负数除以 -1 会引发异常。
语法
参数
返回值
返回 x
和 y
的最小公倍数。(U)Int*
示例
使用示例
max2
引入于:v21.11
返回两个数值 x
和 y
中较大的一个。
语法
参数
x
— 第一个值(U)Int8/16/32/64
或Float*
或Decimal
y
— 第二个值(U)Int8/16/32/64
或Float*
或Decimal
返回值
返回 x
和 y
中较大的值。Float64
示例
使用示例
min2
引入于:v21.11
返回两个数值 x
和 y
中较小的一个。
语法
参数
x
— 第一个值(U)Int8/16/32/64
或Float*
或Decimal
y
— 第二个值(U)Int8/16/32/64
或Float*
或Decimal
返回值
返回 x
和 y
中较小的值。Float64
示例
使用示例
minus
引入于:v1.1
计算两个值 a
和 b
的差。结果始终为有符号。类似于加法,可以从日期或带时间的日期中减去整数。
此外,也支持带时间的日期之间的减法,从而得出它们之间的时间差。
语法
参数
x
— 被减数。 -y
— 减数。
返回值
x
减去 y
示例
减去两个数字
从日期中减去一个整数
modulo
引入于:v1.1
计算两个值 a
除以 b
的余数。
如果两个输入都是整数,结果类型为整数。如果其中一个输入是浮点数,结果类型为 Float64。
余数是按 C++ 中的方式计算的。负数使用截断除法。
除以零或将最小负数除以 -1 会引发异常。
语法
参数
a
— 被除数 -b
— 除数(模数)
返回值
a % b
的余数
示例
使用示例
moduloOrNull
引入于:v25.5
计算 a
除以 b
的余数。类似于 modulo
函数,不同之处在于 moduloOrNull
如果右侧参数为 0 则会返回 NULL。
语法
参数
返回值
返回 x
被 y
除的余数,或当除数为零时返回 null。
示例
moduloOrNull 除以零
moduloOrZero
引入于:v20.3
与 modulo
相似,但在除数为零时返回零,而不是 modulo
函数中的异常。
语法
参数
返回值
返回 a % b
的余数,或当除数为 0
时返回 0
。
示例
使用示例
multiply
引入于:v1.1
计算两个值 x
和 y
的乘积。
语法
参数
返回值
返回 x
和 y
的乘积
示例
乘以两个数字
multiplyDecimal
引入于:v22.12
对两个十进制数进行乘法运算。结果值的类型将是 Decimal256。
结果规模可以通过 result_scale
参数显式指定(范围为 [0, 76]
的常量整数)。如果没有指定,结果规模为给定参数的最大规模。
这些函数的工作速度显著慢于常规的 multiply
。
如果您真的不需要受控精度和/或需要快速计算,考虑使用 multiply。
语法
参数
返回值
具有给定规模的乘法结果。类型: Decimal256
示例
使用示例
与常规乘法的区别
十进制溢出
negate
引入于:v1.1
对参数 x
取反。结果始终为有符号。
语法
参数
x
— 要取反的值。
返回值
返回 -x
示例
使用示例
plus
引入于:v1.1
计算两个值 x
和 y
的和。别名:x + y
(操作符)。
可以将整数和日期或带时间的日期相加。前一种操作增加日期中的天数,后一种操作增加带时间的日期中的秒数。
语法
参数
x
— 左操作数。 -y
— 右操作数。
返回值
返回 x
和 y
的和
示例
加上两个数字
加上一个整数和一个日期
positiveModulo
引入于:v22.11
计算 x
除以 y
的余数。与 modulo
函数类似,不同之处在于 positiveModulo
始终返回非负数。
语法
参数
返回值
返回x
与最大不大于 x
的可被 y
整除的整数之间的差。
示例
使用示例
positiveModuloOrNull
引入于:v25.5
计算 a
除以 b
的余数。与 positiveModulo
函数类似,不同之处在于 positiveModuloOrNull
如果右侧参数为 0 则会返回 NULL。
语法
参数
x
— 被除数。(U)Int*
/Float32/64
。 -y
— 除数(模数)。(U)Int*
/Float32/64
。
返回值
返回 x
与最大不大于 x
的可被 y
整除的整数之间的差,或当除数为零时返回 null。
示例
positiveModuloOrNull