Подходящий тип данных для хранения процентных значений?

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

вопрос задан 4.05.2010
User
22350 репутация

5 ответов


  • 93 рейтинг

    Предполагая два десятичных знака на ваших процентах, тип данных, который вы используете, зависит от того, как вы планируете хранить свои проценты. Если вы собираетесь хранить их дробный эквивалент (например, г. 100. 00% хранится как 1. 0000), я бы сохранил данные в типе данных decimal(5,4) с ограничением CHECK, которое гарантирует, что значения никогда не превышают 1. 0000 (при условии, что это предел) и никогда не опускайтесь ниже 0 (при условии, что это пол). Если вы собираетесь хранить их номинал (например, г. 100. 00% хранится как 100. 00), то вы должны использовать decimal(5,2) с соответствующим ограничением CHECK. В сочетании с хорошим именем столбца он дает понять другим разработчикам, что это за данные и как они хранятся в столбце.

    ответ дан Thomas, с репутацией 55415, 4.05.2010
  • 16 рейтинг
    • Держите как 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)
        )
    

    Дополнительная литература:

    ответ дан JohnLBevan, с репутацией 13195, 14.05.2014
  • 2 рейтинг

    Если ваш уровень точности равен 2 десятичным знакам, то smallint будет обрабатывать это в наименьшем пространстве (2 байта). Вы храните процент, умноженный на 100.

    РЕДАКТИРОВАТЬ: десятичный тип, вероятно, лучше подходит. Тогда вам не нужно масштабировать вручную. Требуется 5 байтов на значение.

    ответ дан mdma, с репутацией 47249, 4.05.2010
  • 1 рейтинг

    Я согласен с Томасом и выбрал бы решение DECIMAL (5,4) хотя бы для приложений WPF.

    Загляните в строку числового формата MSDN, чтобы узнать, почему: http: // msdn. Microsoft. ru / en-us / library / dwhawy9k # PFormatString

    Спецификатор формата процента («P») умножает число на 100 и преобразует его в строку, представляющую процент.

    Тогда вы сможете использовать это в своем коде XAML:

    DataFormatString="{}{0:P}"
    
    ответ дан pjehan, с репутацией 430, 5.06.2014
  • 0 рейтинг

    Используйте число (n, n), где n имеет достаточное разрешение, чтобы округлить до 1. 00. Например:

    declare @discount numeric(9,9)
        , @quantity int
    select @discount = 0.999999999
        , @quantity = 10000
    
    select convert(money, @discount * @quantity)
    
    ответ дан user2202942, с репутацией 1, 29.07.2013