decimalMultiply

语法

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)
# output
9.34759

typestr(c)
# output
DECIMAL32

decimalMultiply(a, b, 2)   // scale 小于min(3,4),函数结果等于 a*b
# output
9.3475915

b=float(`7.5689)
c=decimalMultiply(a, b, 5)   // b 是浮点数, 函数结果等于 a*b,且数据类型是 DOUBLE。
# output
9.3475916337

typestr(c)
# output
DOUBLE

乘法运算(*)和 decimalMultiply 的计算结果如果溢出,会自动转换为更高精度的类型。如果无法进行转换,则会抛出异常。

x = decimal32(1\7, 8)
y = decimal32(1\6, 8)
z = x * y
z
# output
0.0238095223809524
typestr z
# output
DECIMAL64

z = decimalMultiply(x, y, 8)
z
# output
0.02380952
typestr z
# output
DECIMAL64

x = decimal128(1\7, 35)
y = decimal128(1\6, 35)
x*y
# output
x * y => Scale out of bound (valid range: [0, 38], but get: 70)

decimalMultiply(x, y, 35)
# output
decimalMultiply(x, y, 35) => Decimal math overflow

XY 中至少有一个是向量。


x = [decimal32(3.213312, 3), decimal32(3.1435332, 3), decimal32(3.54321, 3)]
y = 2.1
decimalMultiply(x, y, 5)
# output
[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)
# output
[13.85445,14.24407,15.27741]