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



каков наилучший тип данных для хранения процентных значений в диапазоне от 0,00% до 100,00%?

685   5  

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)

Comments

    Ничего не найдено.