Разница между числовым, плавающим и десятичным в SQL Server - PullRequest
285 голосов
/ 29 июня 2009

Я искал в Google, а также посетил десятичное и числовое и SQL Server Helper , чтобы выяснить разницу между числовым, плавающим и десятичным типами данных, а также выяснить, какой из них следует использовать в какой ситуации.

Для любого вида финансовой операции (например, для поля зарплаты), какая из них предпочтительнее и почему?

Ответы [ 8 ]

430 голосов
/ 23 августа 2011

используйте float или real типы данных только в том случае, если точность, обеспечиваемая десятичным (до 38 цифр), недостаточна

  • Приблизительные числовые типы данных не хранят точные значения, указанные для многих чисел; они хранят чрезвычайно близкое приближение значения. ( Technet )

  • Избегайте использования плавающих или вещественных столбцов в условиях поиска предложения WHERE, особенно операторов = и <> ( Technet )

как правило, потому что точность , обеспечиваемая десятичной дробью , равна [10E38 ~ 38 цифр], если в нее может вписаться ваше число, и меньший объем памяти (и, возможно, скорость) Float не важен и имеет дело с ненормальной поведение и проблемы приближенных числовых типов недопустимы, обычно используют десятичное число .

больше полезной информации

  • числовой = десятичный (от 5 до 17 байт) ( точный числовой тип данных)
    • будет отображаться в десятичном формате в .NET
    • оба имеют (18, 0) параметры по умолчанию (точность, масштаб) в SQL-сервере
    • масштаб = максимальное количество десятичных цифр, которые могут быть сохранены справа от десятичной точки.
    • Обратите внимание, что деньги (8 байт) и smallmoney (4 байта) также точны и соответствуют десятичному значению в .NET и имеют 4 десятичных знака ( MSDN )
    • десятичное и числовое (Transact-SQL) - MSDN
  • вещественный (4 байта) ( приблизительный числовой тип данных)
  • float (8 байт) ( Приблизительный Числовой тип данных)
    • отобразится в Double в .NET
  • Все точные числовые типы всегда дают один и тот же результат, независимо от того, какой архитектуры процессора используется или величина чисел
  • Параметр, предоставленный типу данных с плавающей точкой, определяет количество битов, которые используется для хранения мантиссы числа с плавающей запятой .
  • Приблизительный числовой тип данных обычно использует меньше памяти и имеет лучшую скорость (до 20x), и вам также следует учитывать, когда они были преобразованы в .NET

Exact Numeric Data Types Approximate Numeric Data Types

основной источник : MCTS с самостоятельным обучением (экзамен 70-433): разработка баз данных Microsoft® SQL Server® 2008 - Глава 3 - Таблицы, типы данных и декларативные Урок целостности данных 1 - Выбор типов данных (Руководство) - Страница 93

21 голосов
/ 28 июня 2012

Рекомендации MSDN: Использование десятичных, плавающих и реальных данных

Максимальная точность по умолчанию для числовых и десятичных типов данных - 38. В Transact-SQL числовое значение функционально эквивалентно десятичному тип данных. Используйте десятичный тип данных для хранения чисел с десятичными знаками когда значения данных должны храниться точно так, как указано.

Поведение типа float и real следует за Спецификация IEEE 754 о приближенных числовых типах данных. Из-за приблизительного характера чисел с плавающей запятой и реальных типов данных не используйте эти типы данных, когда точно требуется числовое поведение, например, в финансовых приложениях, в операции, включающие округление или проверки на равенство. Вместо этого используйте типы данных integer, decimal, money или smallmoney. Избегайте использования поплавка или реальные столбцы в условиях поиска предложения WHERE, особенно = и <> операторы. Лучше ограничить плавающие и реальные столбцы> или < сравнения.

12 голосов
/ 29 июня 2009

Не полный ответ, а полезная ссылка:

«Я часто делаю вычисления с десятичными значениями. В некоторых случаях приведение десятичных значений к плавающим значениям КАК МОЖНО СКОРЕЕ, перед любыми вычислениями дает лучшую точность.»

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2008/12/20/for-better-precision-cast-decimals-before-calculations.aspx

10 голосов
/ 06 марта 2015

Они различаются по приоритету типа данных

Десятичное число и Числовое значение являются одинаковыми функционально , но все еще существует приоритет типа данных , который в некоторых случаях может быть критическим

SELECT SQL_VARIANT_PROPERTY(CAST(1 AS NUMERIC) + CAST(1 AS DECIMAL),'basetype')

Результирующий тип данных числовой , поскольку он имеет приоритет типа данных .

Исчерпывающий список типов данных по приоритету:

Ссылочная ссылка

6 голосов
/ 29 июня 2009

Десятичное число имеет фиксированную точность, в то время как число с плавающей запятой имеет переменную точность.

РЕДАКТИРОВАТЬ (не удалось прочитать весь вопрос): Float (53) (он же настоящий) - это число с плавающей запятой двойной точности (32-разрядное) в SQL Server. Regular Float - это число с плавающей запятой одинарной точности. Double - хорошая комбинация точности и простоты для многих вычислений. Вы можете создать число с очень высокой точностью с десятичным числом - до 136-битного - но вы также должны быть осторожны, чтобы правильно определить точность и масштаб, чтобы он мог содержать все ваши промежуточные вычисления с необходимым количеством цифр.

2 голосов
/ 18 сентября 2017

Float - это тип данных Приблизительное число, что означает, что не все значения в диапазоне типов данных могут быть представлены точно.

Десятичный / Числовой - это тип данных с фиксированной точностью, что означает, что все значения в диапазоне типов данных могут быть представлены точно с точностью и масштабом. Вы можете использовать десятичную для экономии денег.

Преобразование из десятичного или числового в число с плавающей запятой может привести к некоторой потере точности. Для типов данных Десятичный или Числовой SQL Server рассматривает каждую конкретную комбинацию точности и масштаба как отдельный тип данных. DECIMAL (2,2) и DECIMAL (2,4) - это разные типы данных. Это означает, что 11.22 и 11.2222 - это разные типы, хотя в случае с плавающей запятой это не так. Для FLOAT (6) 11.22 и 11.2222 имеют одинаковые типы данных.

Вы также можете использовать тип данных для экономии денег. Это собственный тип данных с точностью до 4 цифр для денег. Большинство экспертов предпочитают этот тип данных для экономии денег.

Ссылка 1 2 3

1 голос
/ 07 декабря 2018

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

Будьте осторожны с типом данных MONEY, он имеет ограниченную точность.

В ответах на этот вопрос Stackoverflow содержится много полезной информации:

Следует ли выбирать типы данных MONEY или DECIMAL (x, y) в SQL Server?

1 голос
/ 01 ноября 2018

регистр десятичных чисел

Какая это основная потребность?

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

Учтите это:

0.1 (decimal, or "base 10") = .00011001100110011... (binary, or "base 2")

Многоборье [...] означает «бесконечный». Если вы внимательно посмотрите на это, существует бесконечный повторяющийся паттерн (= '0011')

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

Скажите, что вы хотите хранить финансовые суммы (числа, которые могут иметь дробную часть). Прежде всего, вы не можете использовать целые числа явно (целые числа не имеют дробной части). С чисто математической точки зрения естественной тенденцией будет использование float. Но в компьютере числа с плавающей точкой имеют часть числа, которая находится после десятичной точки - «мантисса» - ограниченная. Это приводит к ошибкам округления.

Чтобы преодолеть это, компьютеры предлагают конкретные типы данных, которые ограничивают двоичную ошибку округления в компьютерах для десятичных чисел. Это тип данных, который должны быть использованы для представления финансовых сумм. Эти типы данных обычно идут под именем Decimal. Так обстоит дело в C #, например. Или DECIMAL в большинстве баз данных.

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