将科学记数法转换为BQ中的浮点数

时间:2017-08-04 10:41:01

标签: google-bigquery

有没有一种简单的方法可以将科学记数法中的数字转换为浮点数? 例如:

8.32E-4 to 0,08

2 个答案:

答案 0 :(得分:2)

我认为这可能是出于举报目的吗?这会为你解决吗?

SELECT FORMAT("%.10f", 8.32E-8) number UNION ALL
SELECT FORMAT("%.6f", 8.32E-4) UNION ALL
SELECT FORMAT("%4.f", 8.32E+4) UNION ALL
SELECT FORMAT("%10.f", 8.32E+8)

enter image description here

答案 1 :(得分:1)

我知道这是一个比较老的问题,但是对于任何寻求解决方案的人来说,该查询(尽管有些笨拙)应该适用于所有科学记数法领域。

困难之处在于,BigQuery会将大于E±3的任何数字转换为科学计数法。解决方法是将数字转换为字符串。如果您将此输出用于报告目的,那应该没问题。如果需要处理数字,请确保在转换之前已完成所有计算:

SELECT
number
,base_num
,exponent
,CASE WHEN REGEXP_EXTRACT(number, r'E([+-])') = '+'
      THEN REGEXP_EXTRACT(STRING((base_num * (POW(10, exponent)))), r'(\d+\.0)')
      ELSE STRING(base_num * (POW(10, (exponent * -1))))
      END AS converted_number
FROM
   (SELECT
   number
   ,FLOAT(REGEXP_EXTRACT(number, r'(.*)E')) base_num
   ,INTEGER(REGEXP_EXTRACT(number, r'E[+-](\d+)')) exponent
   FROM 
      (SELECT "8E+1" AS number)
      ,(SELECT "1.6E-3" AS number)
      ,(SELECT "8.32E-4" AS number)
      ,(SELECT "2.92E+9" AS number)
    )

说明:

FLOAT(REGEXP_EXTRACT(number, r'(.*)E'))返回E之前的数字(作为字符串),然后将其转换为浮点数。

INTEGER(REGEXP_EXTRACT(number, r'E[+-](\d+)'))返回E后面的数字(作为字符串),然后将其转换为整数。

然后,将指数提高10(如果为负,则反之),然后乘以基数。

最后,将其强制转换为字符串以保持非科学符号。对于大于1的数字,请使用正则表达式将小数点后的数字四舍五入为0,以便于阅读。

输出:

Row   number      base_num    exponent    converted_number   
1     8E+1        8.0         1           80.0   
2     1.6E-3      1.6         3           0.001600   
3     8.32E-4     8.32        4           0.000832   
4     2.92E+9     2.92        9           2920000000.0   
相关问题