为什么不';Snowflake上的SQL查询是否存在浮点错误?
根据,浮点是双精度(64位)IEEE 754浮点数。这是常态。例如,Python也以这种方式实现浮点,因此会遇到某些值的浮点精度问题。考虑,为什么不';Snowflake上的SQL查询是否存在浮点错误?,sql,floating-accuracy,snowflake-cloud-data-platform,Sql,Floating Accuracy,Snowflake Cloud Data Platform,根据,浮点是双精度(64位)IEEE 754浮点数。这是常态。例如,Python也以这种方式实现浮点,因此会遇到某些值的浮点精度问题。考虑, nRooks$ python3 Python 3.5.2 (default, Nov 12 2018, 13:43:14) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> 0.
nRooks$ python3
Python 3.5.2 (default, Nov 12 2018, 13:43:14)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.3 + 0.6
0.8999999999999999
LiteSQL还为查询提供了值0.899999999999999
,select CAST(0.3作为浮点)+CAST(0.6作为浮点)
。一切如期而至
然而,我从雪花工作表中的以下查询中得到一个奇怪的结果:
select (0.3::float + 0.6::float)::float
Row (0.3::FLOAT + 0.6::FLOAT)::FLOAT
1 0.9
将查询简化为
select 0.6+0.3
不会改变结果。为什么它返回的是.9
而不是预期的0.899999999999999
?与其他人怀疑的一样,这是一个文本格式问题
Snowflake支持多种格式化数字的方式,请参见例如。因此,根据使用的格式,您将看到不同的值,例如:
-- Will round the value
select to_varchar(0.3::float + 0.6::float, '9.999999');
-------------------------------------------------+
TO_VARCHAR(0.3::FLOAT + 0.6::FLOAT, '9.999999') |
-------------------------------------------------+
0.9 |
-------------------------------------------------+
-- Enough decimal digits to print without rounding
select to_varchar(0.3::float + 0.6::float, '9.9999999999999999');
-----------------------------------------------------------+
TO_VARCHAR(0.3::FLOAT + 0.6::FLOAT, '9.9999999999999999') |
-----------------------------------------------------------+
0.8999999999999999 |
-----------------------------------------------------------+
-- "text minimal" format without exponent
select to_varchar(0.3::float + 0.6::float, 'tm9');
--------------------------------------------+
TO_VARCHAR(0.3::FLOAT + 0.6::FLOAT, 'TM9') |
--------------------------------------------+
0.8999999999999999 |
--------------------------------------------+
-- "text minimal" format with exponent
select to_varchar(0.3::float + 0.6::float, 'tme');
--------------------------------------------+
TO_VARCHAR(0.3::FLOAT + 0.6::FLOAT, 'TME') |
--------------------------------------------+
8.999999999999999e-1 |
--------------------------------------------+
注意,这种格式主要在服务器端使用(因此显式转换为_VARCHAR)-不同的客户端可能会对浮点值进行不同的格式设置。也许他们只是使用了不同的库或内部表示,从而使浮点值更准确?Postgres和Oracle也返回0。9@a_horse_with_no_name这是我最初的假设,但后来雪花文档()说它们实现了浮点IEEE 754样式。也许它们在打印值时舍入?打印的值舍入显示;这不是实际值。@seisvelas您可以发布您的代码来澄清这一点,作为您问题的答案吗?可能对其他人有帮助。