【问题标题】:What is the difference between NUMERIC and FLOAT in BigQuery?BigQuery 中的 NUMERIC 和 FLOAT 有什么区别?
【发布时间】:2019-07-14 07:56:30
【问题描述】:

我阅读了文档: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types https://cloud.google.com/bigquery/pricing#data

我知道FLOAT 是 8 个字节,而 NUMERIC 是 16 个字节 这是唯一的区别吗? 文档说NUMERIC 的范围可以从-99999999999999999999999999999.99999999999999999999999999999999999999.999999999,但它没有指定FLOAT 的范围。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    我喜欢当前的答案。我想添加这个来证明为什么需要NUMERIC

    SELECT 
      4.35 * 100 a_float
      , CAST(4.35 AS NUMERIC) * 100 a_numeric
    

    这不是错误——这正是IEEE defines floats 应该被处理的方式。与此同时,NUMERIC 的行为更接近人类的预期。

    对于NUMERIC 有用性的另一个证明,此答案显示了NUMERIC 如何处理numbers too big for JavaScript to normally handle

    在将此问题归咎于 BigQuery 之前,您可以检查一下大多数其他编程语言是否也会这样做。以 Python 为例:

    【讨论】:

    • 问题是我是否只使用点后的 3 位数字。浮动够好吗?
    • 点后多少位数无关紧要。见上面的例子 - 4.35 只有 2,但一些数学运算可能会破坏它的表示。尽管如此,float 对于大多数用途来说已经足够了,即使有时它会让你大吃一惊。
    【解决方案2】:

    有不少区别:

    • 范围:FLOAT 可以达到±2^1023(虽然它不能代表这个范围内的每个整数)

    • 接近零的精度:接近于零,FLOAT 可以精确到 2^-1022。

    • NaN/Inf:FLOAT 具有“非数字”和正负“无限”值,而 NUMERIC 没有。

    • 存储大小:每个NUMERIC需要16字节存储,而FLOAT只需要8字节。

    • 不可预测的性质:正如 Ajay 所暗示的那样,FLOAT 的最大缺点是它可以精确表示的数字与我们通常感兴趣的数字并没有真正紧密地对齐。因此,浮点数应该用于可以接受一些误差的物理量。如果您需要可预测的、精确的人类可预测结果,例如在财务计算中,请使用NUMERIC

    【讨论】:

      【解决方案3】:

      主要区别在于 Floats / Doubles 是二进制浮点类型,而 Numeric 会将值存储为浮点小数点类型。因此,Numeric 具有更高的精度,通常用于需要高精度的货币(金融)应用程序中。但在性能方面,Numeric 比 double 和 float 类型要慢。Numeric 可以 100% 准确地表示十进制格式精度内的任何数字,而 Float 和 Double 不能准确地表示所有数字,甚至是在其各自格式精度内的数字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-03
        • 1970-01-01
        • 1970-01-01
        • 2016-03-11
        • 2016-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多