Типы данных Oracle: советы по выбору NUMBER или BINARY DOUBLE? - PullRequest
5 голосов
/ 29 февраля 2012

Я создаю научное приложение, которое выполняет множество вычислений в Java и C, и точность имеет решающее значение. В базе данных Oracle не происходит никакого перебора чисел (он просто используется для хранения переменных между математическими вычислениями).

Я использовал тип данных двойной точности для всех моих переменных Java и C, который в значительной степени основан на IEEE 754. Итак, данные, записанные в базу данных и затем считанные из базы данных, будут как из точные типы данных в C или Java.

Что бы вы порекомендовали использовать для хранения данных двойного разрешения в Oracle - NUMBER или BINARY DOUBLE?

Например, допустим, у меня есть переменная с именем X_Java, которую я записываю в базу данных как переменная X_DB как BINARY DOUBLE. Если бы я прочитал эти данные обратно в Java из базы данных и сохранил их в переменной X_Java2, было бы X_Java точно совпадает с X_Java2?

Как все изменится. Я храню X_DB в базе данных как НОМЕР?

ОБНОВЛЕНИЕ 1: обратите внимание, что мой критерий "точности" - насколько близко число, считываемое из базы данных, к числу, которое было доступно до записи в базу данных.

С одной стороны, я думаю, что если число, доступное до записи в базу данных, основано на IEEE 754, то тип данных, используемый для хранения этого значения в базе данных, должен быть точным соответствием, если этот тип данных был также основано на IEEE 754.

С другой стороны, поскольку 64-битное число (двойная точность) может точно хранить только до 16 (иногда 17) цифр точности, то сохранение в качестве НОМЕРА в базе данных с 38 цифрами точности должно точно отображаться из и удвоить точность. Недостатком является то, что тип данных NUMBER не может хранить такие большие (или малые) значения, как BINARY DOUBLE.

Итак, мои посты.

Ответы [ 4 ]

5 голосов
/ 29 февраля 2012

В вашем случае, я думаю, BINARY DOUBLE может быть лучшим выбором.Хотя NUMBER может поддерживать более высокую точность, при вставке и извлечении могут потребоваться дополнительные преобразования.

Если вам также необходимо поддерживать специальные числа IEEE754, такие как положительная / отрицательная бесконечность или NaN, то для этого определенно потребуется BINARY DOUBLE вместо NUMBER.Ниже приведена документация оракула о типах данных для 10.2

В столбце NUMBER числа с плавающей запятой имеют десятичную точность.В столбце BINARY_FLOAT или BINARY_DOUBLE числа с плавающей запятой имеют двоичную точность. Двоичные числа с плавающей запятой поддерживают специальные значения бесконечность и NaN (не число) .

Обратите внимание, что оно не поддерживает различие между положительным и отрицательным нулем:

Новые типы данных не соответствуют IEEE754 в следующих областях:

  • -0 приведен к + 0.
  • Сравнение с NaN не поддерживается.
  • Все значения NaN приводятся к BINARY_FLOAT_NAN или BINARY_DOUBLE_NAN.
  • Режимы округления не по умолчанию не поддерживаются.
  • Режим обработки исключений не по умолчанию не поддерживается.
5 голосов
/ 29 февраля 2012

С Oracle документация:

Для Число Тип данных:

Тип данных NUMBER хранит числа с фиксированной и плавающей запятой. чисел практически любой величины могут быть сохранены и гарантированно переносимы среди различных систем, работающих с базой данных Oracle, до 38 цифр точность. ... Oracle гарантирует переносимость чисел с точность равна или меньше 38 цифр.

Для Двоичный двойной / с плавающей запятой тип данных:

База данных Oracle предоставляет два числовых типа данных исключительно для Числа с плавающей точкой: BINARY_FLOAT и BINARY_DOUBLE. Они поддерживают все основные функции, предоставляемые типом данных NUMBER. Однако, хотя NUMBER использует десятичную точность, BINARY_FLOAT и BINARY_DOUBLE использовать двоичную точность. Это позволяет быстрее арифметику расчеты и, как правило, снижает требования к хранению.

BINARY_FLOAT и BINARY_DOUBLE являются приблизительными числовыми типами данных. Oни хранить приблизительные представления десятичных значений, а не точные представления. Например, значение 0.1 не может быть точно представлен либо BINARY_DOUBLE, либо BINARY_FLOAT. Они есть часто используется для научных расчетов. Их поведение похоже к типам данных FLOAT и DOUBLE в Java и XMLSchema.

Исходя из того факта, что вы не занимаетесь обработкой чисел в базах данных и ищете результаты с высокой точностью, я думаю, что Number - лучший тип данных для использования.

1 голос
/ 25 апреля 2015

Почему бы не сохранить их как два значения столбца? Для каждого номера сохраните мантиссу в столбце NUMBER, а показатель степени - в столбце BINARY_FLOAT или BINARY_DOUBLE. Это дает вам максимум. точность (не точность) и диапазон величин. Когда вам нужно использовать число, извлеките два значения из таблицы и «объедините» их в одно число, используя код JAVA / C.

0 голосов
/ 29 июля 2015

Как и упомянутый выше PLS_INTEGER, типы BINARY_FLOAT и BINARY_DOUBLE в Oracle 10g используют машинную арифметику и требуют меньше места для хранения, оба из которых делают их более эффективными, чем тип NUMBER

http://www.dba -oracle.com/plsql/t_plsql_binary_float.htm

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