Соответствующий тип данных для хранения процентных значений?
каков наилучший тип данных для хранения процентных значений в диапазоне от 0.00% до 100.00%?
5 ответов
предполагая два знака после запятой в процентах, тип данных, который вы используете, зависит от того, как вы планируете хранить свои проценты. Если вы собираетесь хранить их дробный эквивалент (например, 100.00% хранится как 1.0000), я бы сохранил данные в decimal(5,4)
тип данных CHECK
ограничение, которое гарантирует, что значения никогда не превышают 1.0000 (предполагая, что это колпачок) и никогда не опускаются ниже 0 (предполагая, что это пол). Если вы собираетесь хранить их номинальную стоимость (например, 100.00% хранится как 100.00), тогда вы должны использовать decimal(5,2)
соответствующей CHECK
ограничения. В сочетании с хорошим именем столбца, он дает понять другим разработчикам, какие данные и как данные хранятся в столбце.
- удерживайте как
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
: C#: хранение процентов, 50 или 0.50? - Decimal vs Numeric:есть ли разница между десятичным и числовым в SQL Server?
Если 2 десятичных знака - это ваш уровень точности, то" smallint " будет обрабатывать это в наименьшем пространстве (2 байта). Вы храните процент, умноженный на 100.
"правка":decimal тип, вероятно, лучше подходит. Тогда вам не нужно вручную масштабировать. Она занимает 5 байт на значение.
Я согласен с Томасом, и я бы выбрал десятичное(5,4) решение, по крайней мере, для приложений WPF.
посмотрите на строку числового формата MSDN, чтобы узнать, почему : http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString
спецификатор формата percent ("P") умножает число на 100 и преобразует его в строку, представляющую процент.
тогда вы сможете использовать это в своем XAML код:
DataFormatString="{}{0:P}"
используйте numeric (n,n), где N имеет достаточное разрешение для округления до 1.00. Например:
declare @discount numeric(9,9)
, @quantity int
select @discount = 0.999999999
, @quantity = 10000
select convert(money, @discount * @quantity)