Вопрос по sql, sql-server, types – Разница между числовым, плавающим и десятичным в SQL Server

266

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

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

Обычно при работе с финансовыми вопросами интересно работать с Integer типы, кромеПлавающая точк и сохраните значения как Центов, вместо того Долларов, например Pedro
Десятичная и числовая ссылка выше требует обновления до Docs.microsoft.com / EN-US / SQL / T-SQL / типы данных / .... Ссылка выше больше не существует. Nigel Ainscoe

Ваш Ответ

8   ответов
403

Поплавок или Реального типы данныхтолько есл точность, обеспечиваемаядесятичны (до 38 цифр) недостаточно

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

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

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

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

numeric = десятичный (от 5 до 17 байт) Точные Числовой тип данных) будет отображаться в десятичном формате в .NETboth имеют (18, 0) параметры по умолчанию (точность, масштаб) в SQL-сервереscale = максимальное количество десятичных цифр, которое можно сохранить справа от десятичной точки. Обратите внимание, что money (8 байт) и smallmoney (4 байт) также точны и соответствуют десятичному в .NET и имеют 4 десятичных знака MSDN) десятичное и числовое (Transact-SQL) - MSDNreal (4 байта) Примерное Числовой тип данных) отобразится в Single в .NET Синоним реального ИСО - это float (24) float и real (Transact-SQL) - MSDNfloat (8 байт) Примерное Числовой тип данных) будет в Double в .NETВсе Точный числовые типы всегда дают один и тот же результат, независимо от того, какой тип архитектуры процессора используется или величина чисел Параметр, предоставленный типу данных с плавающей точкой, определяет количество битов, которые используются для хранения Мантисса числа с плавающей точкой.Approximate Numeric Data Type обычно использует меньше памяти и имеет лучшую скорость (до 20x), и вам также следует учитывать, когда они были преобразованы в .NET В чем разница между десятичным, плавающим и двойным в C # Десятичный против двойной скоростиSQL Server - сопоставления типов данных .NET (из MSDN)

главный источни : Самообучающийся учебный комплект MCCTS (экзамен 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 - Я думал, что реальный МЕНЬШЕ точнее десятичного, так почему же вы пишете, чтобы использовать реальный, если десятичного числа недостаточно? BornToCode
real менее точен, поэтому не рекомендуется, если не требуется хранить большие числа больше десятичного (> 10e38) или из соображений пробелов. Я предполагаю, что точность в кавычке означает возможные значения и величину, а не точность Iman Abidi
@ BornToCode «Точность» здесь относится к тому, насколько широки значения, которые вы хотите сохранить. если вам нужно сохранить значения между 1e10 и 1e-10, тоdecimal будет просто отлично. Это точность 20. Если вам нужно хранить значения между, скажем, 1e20 и 1e-20, ну,decimal Не может сделай это. Это 40 цифр точности. Вы никогда не можете хранить 1e20 и 1e-20 в одном и том жdecimal поле. Вместо этого вы можете использоватьfloat, в котором все хранится как журнал базы 2. Это позволяет получить полный диапазон точности в одном поле с недостатком, что только первые ~ 8 цифр будут точными. Bacon Bits
20

Используя десятичные, плавающие и реальные данные

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

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

(Фиксированное) количество десятичных знаков указывается вScale колонка. Cees Timmerman
Если вы хотите «точно так, как указано», то, с точки зрения стандартов, есть некоторое преимущество дляnumeric поскольку он никогда не будет храниться с большей точностью, чем вы просили: см. Stackoverflow.com / а / 759606/626804 Ed Avis
12

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

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

Это действительно странно. Но это работает ... Akira Yamamoto
Это не имеет смысла. Все остальные ответы, включая источники, говорят, что числовые или десятичные типы данных являются точными, а плавающие или действительные типы являются очень близким приближением. Из-за более низкой точности я могу понять, что приведение к плавающей точке может позволить более быстрые вычисления, но не более высокую точность. cbaldan
Все числовые типы данных могут испытывать переполнение и переполнение. Переполнение является явной ошибкой, однако, при переполнении молчит. Характеристики недополнения дляdecimal а такжеfloat являютсядруго. Десятичная дробь максимально защищает от потери, увеличивая точность или масштаб. Тем не менее, как только вы достигнете предела значащих цифр в десятичном выражении, недопоставки будут молчать (и точность теряется). Float имеет более широкий диапазон возможных масштабов, и его ограничения на самом деле являются причиной недостаточного масштабирования. Таким образом, поплавок может иметь лучший масштаб. Тем не менее, это все еще Неточным тип ErikE
10
Они отличаются приоритетом типов данных

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

'basetype')

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

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

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

6

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

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

Вы не указали, какой вариант предпочтительнее, если дело касается финансовой сделки и почему? priyanka.sarkar
Для SQL Server 2008 и более поздних, float (53), иначе говоря, float - это число с плавающей запятой двойной точности (64-битная), в то время как float (24), иначе говоря, real - это 32-битное число с плавающей запятой одинарной точности. Docs.microsoft.com / EN-US / SQL / T-SQL / типы данных / флоат-и-реального Transact-SQL M Kloster
2

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

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

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

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

Ссылка1 2 3

1
Дело в десятичной

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

Учти это

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

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

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

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

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

1

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

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

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

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

Похожие вопросы