2010-05-04 3 views

ответ

82

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

+7

Не должно быть 'decimal (5,2)' где 2 обозначает количество цифр после десятичного разделителя? –

+2

@BorisCallens - Не могу поверить, что я пропустил это все эти годы. Да, это опечатка. 'decimal (5,2)' - это то, что должно быть зафиксировано с помощью проверочного ограничения. – Thomas

+0

Рад помочь :) –

2

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

EDIT: тип decimal, вероятно, лучше подходит. Тогда вам не нужно вручную масштабировать. Он принимает 5 байт за каждое значение.

0

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

declare @discount numeric(9,9) 
    , @quantity int 
select @discount = 0.999999999 
    , @quantity = 10000 

select convert(money, @discount * @quantity) 
+2

Этот вопрос имеет довольно высокий рейтинг, принятый ответ более трех лет назад. Если вы ищете ответы на старые вопросы, см. Здесь: http://stackoverflow.com/unanswered – valverij

15
  • Отложено как 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) 
    ) 

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

1

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

Взгляните на MSDN Numeric Format String, чтобы узнать, почему: http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString

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

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

DataFormatString="{}{0:P}"