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

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

Дальнейшее чтение:

Ответ 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)