database2010.04.19 10:40
필드 속성인 DECIMAL 은 큰 숫자에 대해서 처리할 때 사용

어느정도 크냐면 -10^38+1 부터 10^38-1 까지의 자릴수 이다..엄청나다.



자 그럼 본론으로 들어가기전에 제발 FLOAT 이딴거 사용하지 말자.

보통 0.000000 등의 소숫점 자리를 표현할 때 FLOAT 를 사용하는데 절대 FLOAT 는 사용하지 말아야 함



그 이유는 FLOAT 및 REAL 테이터 형식은 근사 데이터 형식이어서 정확한 값을 저장하지 않고

가장 가까운 근사값을 저장하기 때문이다. 따라서 요걸 이용하게 되면 나누기 등의 계산을 할때 정확한 값이

출력되지 않고 근사값을 출력하기 때문에 돈 계산시 문제가 발생할 수 있다.





그럼? INTEGER, DECIMAL, MONEY, SMALLMONEY 데이터 형식을 이용하자



여기서 DECIMAL 에 대한 사용방식은?



DECIMAL(5,2) 이렇게 지정한다는 것은 정수 5자리, 소숫점 2자리 라는 의미가 아니고 (즉, 12345.12 라는 의미가 아니다.)

전체 5자리중에서 소숫점이 2자리까지 확보 되었다 라는 의미이다.

정수는 최대 3자리, 소숫점은 최대 2자리 까지 저장될 수 있다. (즉 123.45 라는 의미이다.)



여기 입력될 수 있는 예를 보면

12.345 를 저장하면 12.35

1.2345 를 저장하면 1.23

123.1 을 저장하면 123.10



에러가 발생되는 예를 보면

1234.5

12345 등이 될수 있다.

왜냐면 DECIMAL(5,2) 로 지정했다는 것은 정수가 3자리까지 올수 있다는 건데 지금의 예는 모두 3자리가 넘어간다.

그리고 요런 메세지가 출력된다 - 데이터 형식 numeric(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다.





자 그럼 데이터를 컨버팅할 때 사용방법

FLOAT 를 DECIMAL 로 변경하기

ABC 라는 필드 속성이 FLOAT 인데..이걸 DECIMAL 로 바꾸고 싶다면



ALTER TABLE dbo.Test_Tbl

ALTER COLUMN ABC DECIMAL(5,2) NULL



라고 무작정 만들면 될까?? 당연히 안될 수 도 있다.



FLOAT 속성일 때 데이터가 어떻게 저장 되있느냐에 따라 DECIMAL 의 속성을 변경해 줘야한다.

1.12345 라고 들어가 있는데 소숫점은 2자리 까지, 정수는 5자리까지 표현하고 싶으면

DECIMAL(7,2) 라고 해야한다.

즉, 전체적으로 보고싶은 갯수에 소숫점 갯수 를 입력한다고 생각하면 될듯하다.



만약 지금 1.12345 를 DECIMAL(3,3) 으로 하면 바로 에러가 날 것이다.

왜냐면 전체 3자리중에 소숫점을 3자리로 했으니 당연히 에러 난다.

이렇게 - float을(를) 데이터 형식 numeric(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다.



다른 예를 들면

FLOAT 에 1234.123456 이라고 입력되있는데

DECIMAL(4,2) 라고 하면 당연히 에러난다.



정수가 지금 4자리까지 저장되 있으니 우선 5이상은 해야하며

소숫점 2자리 까지로 하고 싶으면 6 이상으로, 소숫점 1자리 까지 보고 싶으면 5이상은 지정해 줘야한다.



즉, DECIMAL(5,1) 로 하면 1234.1 로 저장될 것이고

DECIMAL(6,2) 로 하면 1234.12 로 저장될 것이다.



여기서 DECIMAL(6,2) 로 필드를 만들면 1234.12 까지 저장되는데 12345.1 을 저장하면 에러난다.

왜냐면 DECIMAL(6,2) 라는 것은 소숫점 2자리까지 확보한것이여서 정수는 4자리까지만 올 수 있다.

따라서 저장되는 데이터의 길이가 어느정도 까지일지 생각하고 만들어야 할 것이다.





-끝-

맘대로 퍼가셔도 좋아요..출처만 명확히...


출처: http://nanamix.tistory.com/entry/필드속성-DECIMAL

Posted by 동동(이재동)