백분율 값을 보유하기위한 적절한 데이터 유형?


답변:


132

백분율에 소수점 두 자리를 가정 할 때 사용하는 데이터 유형은 백분율 저장 계획에 따라 다릅니다. 분수 등가물 (예 : 100.00 %가 1.0000으로 저장 됨)을 저장하려는 경우 값이 1.0000을 초과하지 않고 (최대 값이라고 가정) 0 미만으로 절대로 내려 가지 않도록 decimal(5,4)하는 CHECK제약 조건이 있는 데이터 유형에 데이터를 저장합니다. (바닥이라고 가정). 액면가를 저장하려는 경우 (예 : 100.00 %는 100.00으로 저장 됨) decimal(5,2)적절한 CHECK제약 조건 과 함께 사용해야합니다 . 좋은 열 이름과 결합하면 데이터가 무엇인지, 데이터가 열에 저장되는 방식을 다른 개발자에게 명확하게 알 수 있습니다.


12
decimal(5,2)2가 소수점 구분 기호 뒤의 자릿수를 나타내는 곳 이어야하지 않습니까?
Boris Callens 2012-06-15

2
@BorisCallens-내가 지난 몇 년 동안 그것을 놓쳤다는 것을 믿을 수 없습니다. 예, 오타입니다. decimal(5,2)검사 제약으로 캡처해야하는 것입니다.
토마스

4
나는 이것이 원래 있었으며 위의 주석 이후 decimal(5,4)로 변경 되었다고 가정합니다 decimal(5,2)... decimal(5,4)더 나은 정의 라고 생각 합니다. 즉, 0에서 100이 아닌 소수점 2 자리로 0에서 1을 저장하고 싶습니다. 100; 그래서 100 %는이 방법은 대부분의 경우에 더 의미있게 그 일 1. 100/100 (예 100% * 100% = 100%,하지가 10000%; 1 * 1 = 1).
JohnLBevan

4
@JohnLBevan-저장 방법에 소비합니다. 값이 표시된대로 저장되는 경우 (예 100.00:) decimal(5,2). 값을 분수 (예 :)로 저장 1.0000하려면 decimal(5,4). 게시물을 업데이트합니다.
Thomas

소수점 4 자리가 필요한 이유를 누구든지 설명 할 수 있습니까? 2를 사용할 수 없습니까? .91 === 91 % 또는 1.00 === 100 %와 같습니다. 나는 이것을 지금 구현하고 있으며 4 곳의 이득이 궁금합니다. Pct decimal (10, 2) CHECK (Pct> =. 01 AND Pct <= 1)와 같은 것입니다. 미리 감사드립니다.
MH

31
  • A와 잡습니다 decimal.
  • 범위를 제한하려면 검사 제약 조건을 추가하십시오 (예 : 0 ~ 100 %; 경우에 따라 100 %를 초과하거나 잠재적으로 음수로 이동해야하는 유효한 이유가있을 수 있음).
  • 값 1을 100 %로, 0.5를 50 %로 처리합니다. 이렇게하면 모든 수학 연산이 예상대로 작동 할 수 있습니다 (즉, 값 100을 100 %로 사용하는 것과 반대).
  • 필요에 따라 정밀도와 스케일을 수정합니다 (괄호 안에있는 두 개의 값입니다 columnName decimal(precision, scale). 정밀도는 숫자에 담을 수있는 총 자릿수를 나타내고, 스케일은 소수점 이하 자릿수를 decimal(3,2)나타내므로 표현할 수있는 숫자입니다. 으로는 #.##; decimal(5,3)될 것이다 ##.###.
  • decimalnumeric본질적으로 같은 것입니다. 그러나 decimalANSI 규격이므로 달리 명시하지 않는 한 항상 사용하십시오 (예 : 회사의 코딩 표준).

예제 시나리오

  • 귀하의 경우 (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)
    )

추가 자료 :


4

나는 Thomas와 동의하며 적어도 WPF 응용 프로그램에 대해 DECIMAL (5,4) 솔루션을 선택합니다.

이유를 알기 위해 MSDN Numeric Format String을 살펴보십시오. http://msdn.microsoft.com/en-us/library/dwhawy9k#PFormatString

백분율 ( "P") 형식 지정자는 숫자에 100을 곱하고 백분율을 나타내는 문자열로 변환합니다.

그런 다음 XAML 코드에서 이것을 사용할 수 있습니다.

DataFormatString="{}{0:P}"

2

소수점 이하 2 자리가 정밀도 수준이면 "smallint"는 가장 작은 공간 (2 바이트)에서이를 처리합니다. 100을 곱한 백분율을 저장합니다.

편집 : 십진수 유형이 아마도 더 나은 일치입니다. 그러면 수동으로 확장 할 필요가 없습니다. 값당 5 바이트가 필요합니다.


마이크로 소프트는 그것의 많은 링크를
깨뜨 렸습니다

0

n이 1.00으로 반올림하기에 충분한 해상도를 갖는 numeric (n, n)을 사용하십시오. 예를 들면 :

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

select convert(money, @discount * @quantity)

3
이 질문은 3 년 전부터 상당히 높은 평가를받은 답변입니다. 답변 할 오래된 질문을 찾고 있다면 여기를 참조하십시오. stackoverflow.com/unanswered
valverij
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.