Какой тип данных лучше всего подходит для хранения значений процентов от 0,00% до 100,00%?
Какой тип данных лучше всего подходит для хранения значений процентов от 0,00% до 100,00%?
Ответы:
Предполагая, что ваши проценты имеют два десятичных знака, тип данных, которые вы используете, зависит от того, как вы планируете хранить свои проценты. Если вы собираетесь хранить их дробный эквивалент (например, 100,00% хранится как 1,0000), я бы сохранил данные в decimal(5,4)
типе данных с CHECK
ограничением, которое гарантирует, что значения никогда не превышают 1,0000 (при условии, что это ограничение) и никогда не опускаются ниже 0 (при условии, что это пол). Если вы собираетесь сохранить их номинальную стоимость (например, 100,00% хранится как 100,00), то вы должны использовать decimal(5,2)
с соответствующим CHECK
ограничением. В сочетании с хорошим именем столбца он дает понять другим разработчикам, что это за данные и как они хранятся в столбце.
decimal(5,2)
где 2 обозначает количество цифр после десятичного разделителя?
decimal(5,2)
это то, что должно быть зафиксировано проверочным ограничением.
decimal(5,4)
и было изменено на decimal(5,2)
после вышеприведенного комментария ... Я думаю, что это decimal(5,4)
было бы лучшее определение - то есть вы хотите сохранить от 0 до 1 с двумя десятичными знаками, а не от 0 до 100. Причина в том, что процентное соотношение не соответствует 100; Таким образом, 100% равно 100/100, что составляет 1. В большинстве случаев такой подход имеет смысл (например 100% * 100% = 100%
, нет 10000%
; 1 * 1 = 1
).
100.00
), вам необходимо decimal(5,2)
. Если значения будут храниться в виде дробей (например 1.0000
), тогда вам нужно decimal(5,4)
. Буду обновлять пост.
decimal
.columnName decimal(precision, scale)
. Точность говорит об общем количестве цифр, которое может содержаться в числе, масштаб говорит, сколько из них стоит после десятичного разряда, decimal(3,2)
а также число, которое может быть представлено как #.##
; decimal(5,3)
было бы ##.###
. decimal
и numeric
по сути одно и то же. Однако decimal
он соответствует стандарту ANSI, поэтому всегда используйте его, если не указано иное (например, стандарты кодирования вашей компании).Примеры сценариев
decimal(5,4)
.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)
)
Дальнейшее чтение:
0 to 1
vs 0 to 100
: C #: сохранение процентов, 50 или 0,50?Я согласен с Томасом и выбрал бы решение DECIMAL (5,4) по крайней мере для приложений WPF.
Взгляните на строку числового формата MSDN, чтобы узнать, почему: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString
Спецификатор формата процента («P») умножает число на 100 и преобразует его в строку, представляющую процент.
Тогда вы сможете использовать это в своем коде XAML:
DataFormatString="{}{0:P}"
Если ваш уровень точности составляет 2 десятичных разряда, то "smallint" обработает это в наименьшем пространстве (2 байта). Вы сохраняете процент, умноженный на 100.
РЕДАКТИРОВАТЬ: десятичный тип, вероятно, лучше подходит. Тогда вам не нужно масштабировать вручную. На каждое значение требуется 5 байтов.
Используйте числовые (n, n), где n имеет разрешение, достаточное для округления до 1,00. Например:
declare @discount numeric(9,9)
, @quantity int
select @discount = 0.999999999
, @quantity = 10000
select convert(money, @discount * @quantity)