Каков наилучший тип данных для хранения процентных значений от 0,00% до 100,00%?
Соответствующий тип данных для хранения процентных значений?
Ответ 1
Предполагая два десятичных знака в процентах, используемый вами тип данных зависит от того, как вы планируете хранить свои проценты. Если вы собираетесь хранить свой дробный эквивалент (например, 100,00% хранится как 1.0000), я бы сохранил данные в типе данных decimal(5,4)
с ограничением CHECK
, который гарантирует, что значения никогда не превышают 1.0000 (при условии, что это ограничение ) и никогда не опускаться ниже 0 (предполагая, что это пол). Если вы собираетесь хранить свою номинальную стоимость (например, 100,00% хранится как 100,00), вы должны использовать decimal(5,2)
с соответствующим ограничением CHECK
. В сочетании с хорошим именем столбца он дает понять другим разработчикам, что такое данные и как данные хранятся в столбце.
Ответ 2
- Удерживать как
decimal
. - Добавьте ограничения проверки, если вы хотите ограничить диапазон (например, от 0 до 100%, в некоторых случаях могут быть веские причины выйти за пределы 100% или потенциально даже в негативы).
- Рассчитать значение 1 как 100%, 0,5 как 50% и т.д. Это позволит любым математическим операциям функционировать как ожидалось (т.е. в отличие от использования значения 100 как 100%).
- Измените точность и масштаб по мере необходимости (это два значения в квадратных скобках
columnName decimal(precision, scale)
. Точность говорит, что общее количество цифр, которое можно удерживать в номере, показывает, сколько из них после десятичной точки, поэтомуdecimal(3,2)
- это число, которое может быть представлено как#.##
;decimal(5,3)
будет##.###
. -
decimal
иnumeric
- это, по сути, одно и то же. Однакоdecimal
совместим с ANSI, поэтому всегда используйте это, если не указано иное (например, ваши стандарты кодирования вашей компании).
Пример сценариев
- Для вашего случая (от 0.00% до 100.00%) вам нужно
decimal(5,4)
. - Для наиболее распространенного случая (от 0% до 100%) вам нужно
decimal(3,2)
. - В обоих вышеперечисленных ограничениях проверки будут те же
Пример:
if object_id('Demo') is null
create table Demo
(
Id bigint not null identity(1,1) constraint pk_Demo primary key
, Name nvarchar(256) not null constraint uk_Demo unique
, SomePercentValue decimal(3,2) constraint chk_Demo_SomePercentValue check (SomePercentValue between 0 and 1)
, SomePrecisionPercentValue decimal(5,2) constraint chk_Demo_SomePrecisionPercentValue check (SomePrecisionPercentValue between 0 and 1)
)
Дальнейшее чтение:
- Десятичная шкала и точность: http://msdn.microsoft.com/en-us/library/aa258832%28SQL.80%29.aspx
-
0 to 1
vs0 to 100
: С#: сохранение процентов, 50 или 0.50? - Десятичное число против числа: Есть ли разница между DECIMAL и NUMERIC в SQL Server?
Ответ 3
Если 2 десятичных разряда - ваш уровень точности, тогда "smallint" будет обрабатывать это в наименьшем пространстве (2 байта). Вы сохраняете процент, умноженный на 100.
EDIT: десятичный тип, вероятно, лучше подходит. Тогда вам не нужно вручную масштабировать. Он принимает 5 байт за значение.
Ответ 4
Я согласен с Томасом, и я бы выбрал решение DECIMAL (5,4), по крайней мере, для приложений WPF.
Посмотрите на строку числового формата MSDN, чтобы узнать, почему: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString
Спецификатор формата процента ( "P" ) умножает число на 100 и преобразует его в строку, представляющую процент.
Тогда вы сможете использовать это в своем коде XAML:
DataFormatString="{}{0:P}"
Ответ 5
Используйте числовое значение (n, n), где n имеет достаточное разрешение для округления до 1.00. Например:
declare @discount numeric(9,9)
, @quantity int
select @discount = 0.999999999
, @quantity = 10000
select convert(money, @discount * @quantity)