Snowflake 中的小十进制数计算不正确

问题描述 投票:0回答:1

当我像这样计算 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

这是怎么回事?

snowflake-cloud-data-platform
1个回答
0
投票

执行除法时操作数有以下数据类型:

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
© www.soinside.com 2019 - 2024. All rights reserved.