我对BigQuery标准查询的舍入,截断功能有疑问。
我预计为3953.7、3053.67和3053.667。 f1_,f2_结果不同。这是一个错误吗?
我预计为3.195、3.195、3.1955、3.1965、3.1945。 f1_,f3_结果不同。是我的错吗?
答案 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)
。
希望对您有帮助。