В чем разница между NUMERIC и FLOAT в BigQuery? - PullRequest
0 голосов
/ 20 февраля 2019

Я прочитал документы: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types https://cloud.google.com/bigquery/pricing#data

Я знаю, что FLOAT - это 8 байтов, а NUMERIC - это 16 байтов. Это единственная разница?Документы говорят, что NUMERIC может варьироваться от -99999999999999999999999999999.999999999 до 99999999999999999999999999999.999999999, но не указывает диапазон для FLOAT.

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Существует довольно много различий:

  • Диапазон: FLOAT может быть таким большим, как ± 2 ^ 1023 (хотя он не может представлять каждое целое число в этом диапазоне)

  • Точность около нуля: около нуля, FLOAT может быть с точностью до 2 ^ -1022.

  • NaN / Inf: FLOAT имеет «не число» и положительные и отрицательные «бесконечные» значения, в то время как NUMERIC нет.

  • Размер хранилища: для каждого NUMERIC требуется 16 байтов, но FLOAT требуется всего 8 байтов.

  • Непредсказуемая природа: как намекает Ajay, большой недостаток FLOAT состоит в том, что числа, которые он может точно представлять, не совсем точно совпадают счисла, которые нас обычно интересуют. В результате с плавающей запятой следует использовать физические величины, в которых допустима некоторая ошибка.Если вам нужны предсказуемые, точные, предсказуемые человеком результаты, как в финансовых расчетах, используйте NUMERIC

0 голосов
/ 21 февраля 2019

Мне нравятся текущие ответы.Я хочу добавить это в качестве доказательства необходимости NUMERIC:

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

enter image description here

Это не ошибка - именно так IEEE определяет значения с плавающей точкой должны обрабатываться.Между тем NUMERIC демонстрирует поведение, более близкое к тому, что ожидают люди.

Для еще одного доказательства полезности NUMERIC этот ответ показывает, как NUMERIC может обрабатывать чисел, слишком больших для JavaScript, чтобы нормально обрабатывать .

Прежде чем винить BigQuery за эту проблему, вы можете проверить, что большинство других языков программирования будут делать то же самое.Python, например:

enter image description here

0 голосов
/ 20 февраля 2019

Основное различие заключается в том, что числа с плавающей запятой / Doubles являются двоичными типами с плавающей запятой, а Numeric будет хранить значение как тип с плавающей запятой.Таким образом, числовые имеют гораздо более высокую точность и обычно используются в денежных (финансовых) приложениях, которые требуют высокой степени точности.Но с точки зрения производительности Numeric медленнее, чем double и типы с плавающей запятой. Числовые могут на 100% точно представлять любое число с точностью до десятичного формата, тогда как Float и Double не могут точно представлять все числа, даже числа, которые находятся в пределах точности соответствующих форматов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...