BigQuery-ROUND,TRUNC函数问题

时间:2019-12-16 05:59:24

标签: google-bigquery

我对BigQuery标准查询的舍入,截断功能有疑问。

enter image description here

我预计为3953.7、3053.67和3053.667。 f1_,f2_结果不同。这是一个错误吗?

enter image description here

我预计为3.195、3.195、3.1955、3.1965、3.1945。 f1_,f3_结果不同。是我的错吗?

2 个答案:

答案 0 :(得分:1)

这是由于以下事实:在BigQuery中,数字默认情况下存储为浮点值。

您可以在Wikipedia中找到有关它们如何工作的更多信息,但主要思想是某些数字不是按原样存储的,而是按其表示允许的最近似值存储的。如果在内部将其表示为3.0299999999 ...而不是3.03,则将其删减后的结果将为3.02。

取整功能也会发生同样的情况,如果将3053.665内部存储为3053.6649999999 ...,则取整的结果将为3053.66。

如果您指定将其存储为NUMERIC,则它将作为“预期”:

 select trunc(numeric '3.195', 3)

给出结果3.195

您可以在官方BigQuery Documentation.

中找到有关数字类型的更多信息。

答案 1 :(得分:1)

ROUND()用于将数字字段四舍五入到指定的小数位数。 floating point values有一个限制。 它们只能表示二进制值,而不能精确地表示小数点后的十进制数字(请参见here)。

如果收到SELECT ROUND(3053.665,2),您将收到:3053.66,可以使用:ROUND(value + 0.005, 2)来克服它,它可以使您收到3053.67

无论如何,如果要注意精确的十进制结果,则应使用NUMERIC type。以下查询提供您期望的结果:

SELECT ROUND(3953.65,1), ROUND(numeric '3053.665',2), ROUND(numeric '3053.6665',3)

TRUNC(),以下查询会给出您期望的结果:

SELECT TRUNC(3.1955,3), TRUNC(numeric'3.195',3), TRUNC(3.1955,4), TRUNC(numeric '3.1965',4), TRUNC(3.1945,4)

BigQuery默认将小数解析为浮点以提高性能,而其他数据库默认将小数解析为NUMERIC。这意味着其他数据库将以与BigQuery解释TRUNC(3.03,2)相同的方式解释TRUNC(numeric '3.03',2)

希望对您有帮助。