Разница между числовым, float и decimal в SQL Server

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

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

6 ответов


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

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

  • избегайте использования float или реальные столбцы в условиях поиска предложения WHERE, особенно операторы = и (в TechNet)

так вообще-за точность, обеспечиваемая decimal является [10e38 ~ 38 цифр], если ваш номер может поместиться в нем, и меньшее пространство для хранения (и, возможно, скорость) Float не имеет значения, и дело с аномальным поведением и проблемами приблизительных числовых типов неприемлемо,использовать Decimal вообще.

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

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

Exact Numeric Data TypesApproximate Numeric Data Types

основной источник : MCTS Self-Paced Training Kit (Exam 70-433): разработка баз данных Microsoft® SQL Server® 2008 - Глава 3-таблицы, типы данных и декларативная целостность данных Урок 1-выбор типов данных (рекомендации) - страница 93


рекомендации от MSDN: используя decimal, float и реальные данные

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

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


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

" Я часто делаю вычисления против десятичных значений. В некоторых случаях литье десятичных значений для float ASAP до любых вычислений дает лучшую точность. "

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


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

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

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

полученный тип данных цифровой потому что он принимает тип данных приоритет.

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

ссылка ссылка


Decimal имеет фиксированную точность, в то время как float имеет переменную точность.

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


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

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

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

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

ссылка 1 2 3