当我像这样计算 Snowflake 中的 1 / 100,000,000 时:
SELECT (1 / 100000000)::NUMBER(38,12);
结果显示为0:
0.000000000000
即使精度足够高。
然而,当我删除两个零并除以 1 / 1,000,000 时,它会按预期工作:
SELECT (1 / 1000000)::NUMBER(38,12);
然后我得到正确的结果0.000001:
0.000001000000
这是怎么回事?
执行除法时操作数有以下数据类型:
SELECT 1, 100000000, (1 / 100000000);
DESCRIBE RESULT LAST_QUERY_ID();
-- NUMBER(1,0) -- NUMBER(9,0) -- NUMBER(7,6)
部门:
执行除法时:
输出的前导数字是分子前导数字与分母小数位数之和。
Snowflake 通过在分子的标度上添加 6 位数字(最大阈值为 12 位数字),最大限度地减少输出中潜在的溢出(由于链式除法)和标度损失,除非分子的标度大于 12,在这种情况下,分子刻度用作输出刻度。
如果除法运算的结果超出输出范围,Snowflake 会对输出进行四舍五入(而不是截断输出)。
因此在分割之前应进行铸造:
SELECT (1 / 100000000)::NUMBER(38,12);
-- 0.000000000000
=>
SELECT 1::NUMBER(38,12) / 100000000;
-- 0.000000010000