decimal精度问题

Viewed 74
CAST(m AS DECIMALV3(38, 8)) / 1e8 * CAST(c AS DECIMALV3(38, 8)) / 1e8 AS v1 -> 0.0000155000
(CAST(m AS DECIMALV3(38, 8)) / 1e8) * (CAST(c AS DECIMALV3(38, 8)) / 1e8) AS v2 -> 0.0000160000

上面这段v1的值是我们想要的结果,但是因为如果c太大时,会出现overflow的错误,所以改成v2的写法,却发现v2的值不一样。
想请问下应该怎么改才能满足v1的值并且不会遇到overflow呢?感谢

可以试试以下数据复现
m = 1550000
c = 100000

3 Answers

【问题状态】跟进中
【问题处理】内部定位中,有进展会更新到论坛

这不符合decimal计算规则吧
以上面的例子为例好了
m = 1550000
c = 100000
(CAST(m AS DECIMALV3(38, 8)) / 1e8) = 0.0155000000 -> 这里应该还是DECIMALV3(38, 8)类型
(CAST(c AS DECIMALV3(38, 8)) / 1e8) = 0.0010000000 -> 这里也还是DECIMALV3(38, 8)类型
0.0155000000 * 0.0010000000 = 0.0000155000
两个DECIMALV3(38, 8)相乘,decimal规则要保留8精度吧
v2版本没有超过8位却自动进位成0.0000160000

CREATE TABLE test.test (
    m DECIMAL(38, 8) NOT NULL,
    c DECIMAL(38, 8) NOT NULL
)
UNIQUE KEY(m, c)
DISTRIBUTED BY HASH(m) BUCKETS AUTO
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

image.png