在BigQuery中,NUMERIC和FLOAT有什么区别?

27
3个回答

35

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

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

在此输入图像描述

这不是一个 bug - 这正是IEEE 定义的浮点数应该处理的方式。与此同时,NUMERIC 表现出更接近人类期望的行为。

为了另一个证明 NUMERIC 的有用性,这个答案展示了如何使用 NUMERIC 处理普通 JavaScript 无法处理的大数字

在责怪 BigQuery 这个问题之前,您可以检查大多数其他编程语言都会执行相同的操作。例如 Python:

在此输入图像描述


问题是,如果我只使用小数点后的3位数字,那么float类型是否足够? - Luis
1
小数点后有多少位并不重要。如上面的例子-4.35只有2位,但某些数学运算可能会影响其表示。尽管有时候它会让你感到惊讶,但浮点数对于大多数用途来说已经足够好了。 - Felipe Hoffa
16字节足够保证精度达到1/1000,我认为甚至可以达到10的负十次方。64位浮点数通常有53个尾数位和11个指数位。所以最坏情况下,一个介于2的10次方到2的11次方之间的数可以准确表示为2的(11-53)次方的倍数,即2的负42次方。大约相当于10的负十次方。如果我说错了,请有人纠正我。 - william_grisaitis
16字节足够保证精度达到1/1000,我认为甚至可以达到10的负10次方。64位浮点数通常有53位尾数和11位指数。所以最坏情况下,一个介于2的10次方到2的11次方之间的数可以准确表示为2的11次方减去53次方的倍数,即2的负42次方。大约相当于10的负10次方。如果我有错误,请有人纠正我。 - undefined

10
有几个主要的区别:
  • 范围: FLOAT 可以达到 ±2^1023 (虽然它不能表示该范围内的每一个整数)

  • 接近零点的精度:在接近零点时,FLOAT 的精度可以达到 2^-1022。

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

  • 存储大小:每个 NUMERIC 需要 16 个字节的存储空间,但 FLOAT 只需要 8 个字节。

  • 不可预测的特性:正如 Ajay 所暗示的那样,FLOAT 的最大缺点是它能够精确表示的数字与我们通常感兴趣的数字并没有那么接近。因此,应将浮点数用于某些误差可接受的物理量。如果您需要可预测的、精确的人类可预测的结果,例如金融计算,请使用 NUMERIC


8

主要区别在于浮点数/双精度浮点数是二进制浮点类型,而数字将值存储为浮点十进制类型。因此,数字具有更高的精度,通常用于需要高度准确性的货币(金融)应用程序。但从性能方面来看,数字比双精度和浮点类型慢。数字可以100%准确地表示小数格式精度范围内的任何数字,而浮点数和双精度浮点数不能准确地表示所有数字,即使这些数字在其各自格式的精度范围内。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接