Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不';Snowflake上的SQL查询是否存在浮点错误?_Sql_Floating Accuracy_Snowflake Cloud Data Platform - Fatal编程技术网

为什么不';Snowflake上的SQL查询是否存在浮点错误?

为什么不';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.

根据,浮点是双精度(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.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您可以发布您的代码来澄清这一点,作为您问题的答案吗?可能对其他人有帮助。