Каков наилучший тип данных для хранения процентных значений от 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 обозначает количество цифр после десятичного разделителя? –
@BorisCallens - Не могу поверить, что я пропустил это все эти годы. Да, это опечатка. 'decimal (5,2)' - это то, что должно быть зафиксировано с помощью проверочного ограничения. – Thomas
Рад помочь :) –
Если 2 десятичных разряда - ваш уровень точности, тогда «smallint» будет обрабатывать это в наименьшем пространстве (2 байта). Вы сохраняете процент, умноженный на 100.
EDIT: тип decimal, вероятно, лучше подходит. Тогда вам не нужно вручную масштабировать. Он принимает 5 байт за каждое значение.
Используйте числовое значение (n, n), где n имеет достаточное разрешение для округления до 1.00. Например:
declare @discount numeric(9,9)
, @quantity int
select @discount = 0.999999999
, @quantity = 10000
select convert(money, @discount * @quantity)
Этот вопрос имеет довольно высокий рейтинг, принятый ответ более трех лет назад. Если вы ищете ответы на старые вопросы, см. Здесь: http://stackoverflow.com/unanswered – valverij
- Отложено как
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)
)
Дополнительная литература:
- Десятичный Шкала & Точность: http://msdn.microsoft.com/en-us/library/aa258832%28SQL.80%29.aspx
0 to 1
против0 to 100
: C#: Storing percentages, 50 or 0.50?- Десятичный против Числовой: Is there any difference between DECIMAL and NUMERIC in SQL Server?
Я согласен с Томасом, и я выбрал бы DECIMAL (5,4) решение, по крайней мере для приложений WPF.
Взгляните на MSDN Numeric Format String, чтобы узнать, почему: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString
процент («P») спецификатор формата умножает число на 100 и преобразует его в строку, которая представляет собой процент.
Тогда вы могли бы использовать это в коде XAML:
DataFormatString="{}{0:P}"
также нашел соответствующую должность: http://stackoverflow.com/questions/1602318/what-should-be-the -best-way-to-store-a-percent-value-in-sql-server – User