decimalMultiply
New in version 2.00.10.
语法
decimalMultiply(X, Y, scale)
参数
X / Y:标量或向量,其中至少有一个必须为 DECIMAL 类型。
scale:非负整型标量,表示计算结果保留的小数位数。
详情
DECIMAL 类型的乘法运算,相较于 mul 函数或运算符 *,该函数可以指定计算结果保留的小数位数。
注意:
在以下情况下,scale 参数将会失效,返回值类型为 DECIMAL:
只有一个参数是 DECIMAL 类型(小数位数是 S),且指定的 scale 值不等于 S。
X 和 Y 都是 DECIMAL 类型(小数位数分别是 S1 和 S2),且指定的 scale 值小于 min(S1, S2) 或大于 S1+S2。
当其中一个参数是浮点数时,scale 参数将会失效,并且返回值类型为 DOUBLE。
当 scale 参数失效时,该函数的计算结果等同于 X * Y。
返回值:DECIMAL 或 DOUBLE 类型。
例子
$ a = decimal32(`1.235, 3);
$ b = decimal32(`7.5689, 4);
$ c=decimalMultiply(a, b, 5)
9.34759
$ typestr(c)
DECIMAL32
$ decimalMultiply(a, b, 2) // scale 小于min(3,4),函数结果等于 a*b
9.3475915
$ b=float(`7.5689)
$ c=decimalMultiply(a, b, 5) // b 是浮点数, 函数结果等于 a*b,且数据类型是 DOUBLE。
9.3475916337
$ typestr(c)
DOUBLE
乘法运算(*)和 decimalMultiply 的计算结果如果溢出,会自动转换为更高精度的类型。如果无法进行转换,则会抛出异常。
$ x = decimal32(1\7, 8)
$ y = decimal32(1\6, 8)
$ z = x * y
$ z
0.0238095223809524
$ typestr z
DECIMAL64
$ z = decimalMultiply(x, y, 8)
$ z
0.02380952
$ typestr z
DECIMAL64
$ x = decimal128(1\7, 35)
$ y = decimal128(1\6, 35)
$ x*y
x * y => Scale out of bound (valid range: [0, 38], but get: 70)
$ decimalMultiply(x, y, 35)
decimalMultiply(x, y, 35) => Decimal math overflow
X 和 Y 中至少有一个是向量。
$ x = [decimal32(3.213312, 3), decimal32(3.1435332, 3), decimal32(3.54321, 3)]
$ y = 2.1
$ decimalMultiply(x, y, 5)
[6.7473,6.6003,7.440300000000001]
$ x = [decimal32(3.213312, 3), decimal32(3.1435332, 3), decimal32(3.54321, 3)]
$ y = [decimal64(4.312412, 3), decimal64(4.53231, 3), decimal64(4.31258, 3)]
$ decimalMultiply(x, y, 5)
[13.85445,14.24407,15.27741]