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

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

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

Ответ 1

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

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

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

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

более полезная информация

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

Exact Numeric Data TypesApproximate Numeric Data Types

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

Ответ 2

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

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

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

Ответ 4

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

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

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

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

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

Ссылка ссылки

Ответ 5

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

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

Ответ 6

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

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

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

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

Ссылка 1 2 3

Ответ 7

Случай десятичного

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

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

Учти это:

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

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

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

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

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

Ответ 8

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

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

В ответах на этот вопрос Stackoverflow есть много хорошей информации:

Должны ли вы выбирать типы данных MONEY или DECIMAL (x, y) в SQL Server?