算术函数
概述
算术函数适用于任何两个类型为 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或UInt32 * UInt32 = UInt64。
这些规则确保结果类型将是能够表示所有可能结果的最小类型。虽然这会引入在值范围边界附近溢出的风险,但它确保了使用最大 64 位本机整数宽度进行快速计算。这种行为也保证了与许多其他数据库的兼容性,这些数据库提供 64 位整数 (BIGINT) 作为最大的整数类型。
示例
溢出与 C++ 中的方式相同。
abs
引入于:v1.1
计算 x 的绝对值。如果 x 是无符号类型,则没有效果。如果 x 是有符号类型,则返回一个无符号数字。
语法
参数
x— 要获取绝对值的数值
返回值
x 的绝对值
示例
使用示例
avg2
引入于:v25.11
计算并返回所提供参数的平均值。支持数值和时间类型。
语法
参数
x1, x2]— 接受两个用于求平均的值。
返回值
返回所提供参数的平均值,提升到最大的兼容类型。
示例
数值类型
十进制类型
日期类型
日期时间类型
Time64 类型
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 的最大公约数。
除以零或将最小负数除以负一时会抛出异常。
语法
参数
x— 第一个整数 -y— 第二个整数
返回值
x 和 y 的最大公约数。
示例
使用示例
ifNotFinite
引入于:v20.3
检查浮点值是否有限。
您可以使用 三元运算符获得类似的结果:isFinite(x) ? x : y。
语法
参数
返回值
- 如果
x是有限的,则为x。 - 如果
x不是有限的,则为y。
示例
使用示例
intDiv
引入于:v1.1
执行两个值 x 除以 y 的整数除法。换句话说,它计算向下舍入到下一个最小整数的商。
结果与被除数(第一个参数)的宽度相同。
除以零、商不适合被除数的范围或将最小负数除以负一时会抛出异常。
语法
参数
x— 左操作数。 -y— 右操作数。
返回值
x 和 y 的整数除法结果
示例
两个浮点数的整数除法
商不适合被除数的范围
intDivOrNull
引入于:v25.5
与 intDiv 相同,但除以零或将最小负数除以负一时返回 NULL。
语法
参数
返回值
x 和 y 的整数除法结果,或 NULL。
示例
除以零
将最小负数除以 -1
intDivOrZero
引入于:v1.1
与 intDiv 相同,但除以零或将最小负数除以负一时返回零。
语法
参数
返回值
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 的最小公倍数。
除以零或将最小负数除以负一时会抛出异常。
语法
参数
返回值
返回 x 和 y 的最小公倍数。 (U)Int*
示例
使用示例
max2
引入于:v21.11
返回两个数值 x 和 y 中较大的一个。
语法
参数
x— 第一个值(U)Int8/16/32/64或Float*或Decimaly— 第二个值(U)Int8/16/32/64或Float*或Decimal
返回值
返回 x 和 y 中较大的值。 Float64
示例
使用示例
midpoint
引入于:v25.11
计算并返回所提供参数的平均值。支持数值和时间类型。
语法
参数
x1[, x2, ...]— 接受单个值或多个值进行平均。
返回值
返回所提供参数的平均值,提升到最大的兼容类型。
示例
数值类型
十进制类型
日期类型
日期时间类型
Time64 类型
min2
引入于:v21.11
返回两个数值 x 和 y 中较小的一个。
语法
参数
x— 第一个值(U)Int8/16/32/64或Float*或Decimaly— 第二个值(U)Int8/16/32/64或Float*或Decimal
返回值
返回 x 和 y 中较小的值。 Float64
示例
使用示例
minus
引入于:v1.1
计算两个值 a 和 b 的差。结果始终是有符号的。与 plus 类似,可以将整数从日期或日期与时间中减去。此外,还支持日期与时间之间的减法,从而得到它们之间的时间差。
语法
参数
x— 被减数。 -y— 减数。
返回值
x 减 y
示例
减去两个数字
减去一个整数和一个日期
modulo
引入于:v1.1
计算 a 除以 b 的余数。
如果两个输入都是整数,则结果类型为整数。如果其中一个输入是浮点数,则结果类型为 Float64。
余数计算方式与 C++ 相同。对于负数使用截断除法。
除以零或将最小负数除以负一时会抛出异常。
语法
别名:mod
参数
a— 被除数 -b— 除数(模数)
返回值
a % b 的余数
示例
使用示例
moduloOrNull
引入于:v25.5
计算 a 除以 b 的余数。类似于函数 modulo,但如果右侧参数为 0,则 moduloOrNull 将返回 NULL。
语法
别名:modOrNull
参数
返回值
返回 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 的 -x
示例
使用示例
plus
引入于:v1.1
计算两个值 x 和 y 的和。别名:x + y(运算符)。可以添加整数和日期或日期与时间。前一种操作会增加日期中的天数,后一种操作会增加日期与时间中的秒数。
语法
参数
x— 左操作数。 -y— 右操作数。
返回值
返回 x 和 y 的和
示例
加两个数
将整数和日期相加
positiveModulo
引入于:v22.11
计算 x 除以 y 的余数。类似于函数 modulo,但 positiveModulo 始终返回非负数。
语法
别名:positive_modulo, pmod
参数
返回值
返回 x 与小于或等于 x 且可被 y 整除的最近整数之间的差。
示例
使用示例
positiveModuloOrNull
引入于:v25.5
计算 a 除以 b 的余数。类似于函数 positiveModulo,但如果右侧参数为 0,则 positiveModuloOrNull 将返回 NULL。
语法
别名:positive_modulo_or_null, pmodOrNull
参数
x— 被除数。(U)Int*/Float32/64. -x— 除数(模数)。(U)Int*/Float32/64。
返回值
返回 x 与小于或等于 x 且可被 y 整除的最近整数之间的差,当除数为零时返回 null。
示例
positiveModuloOrNull