Каковы различия между numeric
, float
и decimal
типы данных и которые должны быть использованы в каких ситуациях?
Для любого вида финансовой транзакции (например, для поля зарплаты), какая из них предпочтительнее и почему?
Каковы различия между numeric
, float
и decimal
типы данных и которые должны быть использованы в каких ситуациях?
Для любого вида финансовой транзакции (например, для поля зарплаты), какая из них предпочтительнее и почему?
Ответы:
используйте типы данных float или real, только если точность, обеспечиваемая десятичной дробью (до 38 цифр), недостаточна
Приблизительные числовые типы данных не хранят точные значения, указанные для многих чисел; они хранят чрезвычайно близкое приближение значения. ( Technet )
Избегайте использования плавающих или вещественных столбцов в условиях поиска предложения WHERE, особенно операторов = и <> ( Technet )
как правило, потому что точность, обеспечиваемая десятичной дробью, составляет [10E38 ~ 38 цифр], если ваш номер может в нее поместиться, и меньший объем памяти (и, возможно, скорость) Float не важен, и дело с ненормальным поведением и проблемами приближенных числовых типов не является допустимо, используйте десятичную вообще .
больше полезной информации
основной источник : MCTS Self-Paced Training Kit (экзамен 70-433): Разработка баз данных Microsoft® SQL Server® 2008 - Глава 3 - Таблицы, типы данных и декларативная целостность данных Урок 1 - Выбор типов данных (рекомендации) - Страница 93
use the float or real data types only if the precision provided by decimal is insufficient
- Я думал, что реальный МЕНЬШЕ точнее десятичного, так почему же вы пишете, чтобы использовать реальный, если десятичного числа недостаточно?
decimal
все будет в порядке. Это точность 20. Если вам нужно хранить значения между, скажем, 1e20 и 1e-20, ну, decimal
вы не можете этого сделать. Это 40 цифр точности. Вы никогда не сможете хранить 1e20 и 1e-20 в одном decimal
поле. Вместо этого вы можете использовать float
, который внутренне сохраняет все как журнал базы 2. Это обеспечивает полный диапазон точности в одном поле с недостатком, что только первые ~ 8 цифр будут точными.
float
...» - сказал кто? Это цитата или ваше мнение?
Рекомендации MSDN: использование десятичных, плавающих и реальных данных
Максимальная точность по умолчанию для числовых и десятичных типов данных - 38. В Transact-SQL числовое значение функционально эквивалентно десятичному типу данных. Используйте десятичный тип данных для хранения чисел с десятичными знаками, когда значения данных должны храниться точно так, как указано.
Поведение float и real соответствует спецификации IEEE 754 для приблизительных числовых типов данных. Из-за приблизительной природы типов данных с плавающей запятой и реальных данных не используйте эти типы данных, когда требуется точное числовое поведение, например, в финансовых приложениях, в операциях, связанных с округлением или при проверках на равенство. Вместо этого используйте типы данных integer, decimal, money или smallmoney. Избегайте использования плавающих или вещественных столбцов в условиях поиска предложения WHERE, особенно операторов = и <>. Лучше ограничить плавающие и реальные столбцы> или <сравнениями.
Scale
столбце.
numeric
поскольку оно никогда не будет хранить с большей точностью, чем вы просили: см. Stackoverflow.com/a/759606/626804
Не полный ответ, а полезная ссылка:
«Я часто делаю вычисления с десятичными значениями. В некоторых случаях приведение десятичных значений к плавающим значениям КАК МОЖНО СКОРЕЕ, перед любыми вычислениями дает лучшую точность»
decimal
и float
могут отличаться . Десятичная дробь максимально защищает от потери, увеличивая точность или масштаб. Однако, как только вы достигнете предела значащих цифр в десятичном выражении, потери значения будут молчать (и точность теряется). Float имеет более широкий диапазон возможных масштабов, и его ограничения на самом деле являются причиной недостаточного масштабирования. Таким образом, поплавок может иметь лучший масштаб. Тем не менее, это все еще неточный тип.
Десятичный и числовой значения одинаковы в функциональном отношении, но все еще сохраняется приоритет типов данных , который в некоторых случаях может иметь решающее значение.
SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')
Результирующий тип данных является числовым, поскольку он имеет приоритет над типом данных .
Исчерпывающий список типов данных по приоритету:
Десятичная имеет фиксированную точность, в то время как float имеет переменную точность.
РЕДАКТИРОВАТЬ (не удалось прочитать весь вопрос): Float (53) (он же настоящий) - это число с плавающей запятой двойной точности (32-разрядное) в SQL Server. Regular Float - это число с плавающей запятой одинарной точности. Double - хорошая комбинация точности и простоты для многих вычислений. Вы можете создать число с очень высокой точностью с десятичным числом - до 136-битных - но вы также должны быть осторожны, чтобы правильно определить свою точность и масштаб, чтобы он мог содержать все ваши промежуточные вычисления с необходимым количеством цифр.
Float - это тип данных Приблизительное число, что означает, что не все значения в диапазоне типов данных могут быть представлены точно.
Десятичный / Числовой тип данных с фиксированной точностью, что означает, что все значения в диапазоне типов данных могут быть представлены точно с точностью и масштабом. Вы можете использовать десятичную для экономии денег.
Преобразование из десятичного или числового в плавающее может привести к некоторой потере точности. Для типов данных Десятичный или Числовой SQL Server рассматривает каждую конкретную комбинацию точности и масштаба как отдельный тип данных. DECIMAL (2,2) и DECIMAL (2,4) - это разные типы данных. Это означает, что 11.22 и 11.2222 - это разные типы, хотя в случае с плавающей точкой это не так. Для FLOAT (6) 11.22 и 11.2222 являются одинаковыми типами данных.
Вы также можете использовать тип данных деньги для экономии денег. Это собственный тип данных с точностью до 4 цифр для денег. Большинство экспертов предпочитают этот тип данных для экономии денег.
Какая это основная потребность?
Это связано с тем, что, в конечном счете, компьютеры представляют собой числа в двоичном формате. Это неизбежно приводит к ошибкам округления.
Учти это:
0.1 (decimal, or "base 10") = .00011001100110011... (binary, or "base 2")
Вышеуказанный многоточие [...] означает «бесконечный». Если вы внимательно посмотрите на это, существует бесконечный повторяющийся паттерн (= '0011')
Итак, в какой-то момент компьютер должен округлить это значение. Это приводит к ошибкам накопления, возникающим из-за многократного использования чисел, которые хранятся неточно.
Скажем, вы хотите хранить финансовые суммы (это числа, которые могут иметь дробную часть). Прежде всего, вы не можете использовать целые числа явно (целые числа не имеют дробной части). С чисто математической точки зрения естественной тенденцией будет использование float
. Но в компьютере числа с плавающей точкой имеют часть числа, которая находится после десятичной точки - «мантисса» - ограниченная. Это приводит к ошибкам округления.
Чтобы преодолеть это, компьютеры предлагают определенные типы данных, которые ограничивают двоичную ошибку округления в компьютерах для десятичных чисел. Это тип данных, который обязательно должен использоваться для представления финансовых сумм. Эти типы данных обычно идут по имени Decimal
. Так обстоит дело, например, в C #. Или DECIMAL
в большинстве баз данных.
Хотя этот вопрос не включает тип данных MONEY, некоторые люди, сталкивающиеся с этим потоком, могут испытывать искушение использовать тип данных MONEY для финансовых расчетов.
Будьте осторожны с типом данных MONEY, он имеет ограниченную точность.
В ответах на этот вопрос Stackoverflow много полезной информации об этом:
Следует ли вам выбирать типы данных MONEY или DECIMAL (x, y) в SQL Server?