DECIMALV3
四则运算
- 加法 / 减法:DECIMALV3(a, b) + DECIMALV3(x, y) -> DECIMALV3(max(a - b, x - y) + max(b, y), max(b, y)),即整数部分和小数部分都分别使用两个操作数中较大的值。
- 乘法:DECIMALV3(a, b) + DECIMALV3(x, y) -> DECIMALV3(a + x, b + y)。
- 除法:DECIMALV3(a, b) + DECIMALV3(x, y) -> DECIMALV3(a + y, b)。
聚合运算
- AVG:AVG(DECIMALV3(a, b)) -> DECIMALV3(38, max(b, 4))。
默认规则
除上述提到的函数外,其余表达式都使用默认规则进行精度推演。即对于表达式 ,结果类型同样也是DECIMALV3(a, b)。
调整结果精度
- 如果期望的结果精度大于默认精度,可以通过调整入参精度来调整结果精度。例如用户期望计算
AVG(col)
得到DECIMALV3(x, y)作为结果,其中的类型为DECIMALV3(a, b),则可以改写表达式为AVG(CAST(col as DECIMALV3(x, y)))
。 - 如果期望的结果精度小于默认精度,可以通过对输出结果求近似得到想要的精度。例如用户期望计算得到DECIMALV3(x, y)作为结果,其中
col
的类型为DECIMALV3(a, b),则可以改写表达式为。
Doris中的DECIMALV3是真正意义上的高精度定点数,相比于老版本的Decimal,DecimalV3有以下核心优势:
- 可表示范围更大。DECIMALV3中precision和scale的取值范围都进行了明显扩充。
- 性能更高。老版本的DECIMAL在内存中需要占用16 bytes,在存储中占用12 bytes,而DECIMALV3进行了自适应调整(如下表格)。