Соответствующий тип данных для хранения процентных значений?

каков наилучший тип данных для хранения процентных значений в диапазоне от 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)
    )

Читайте Далее:


Если 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)