IT

[mssql]소수점 연산 시 데이터 값 오류

타크 2019. 2. 28. 14:55
반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
declare @y decimal(30,20) , @scaleFactor decimal(30,20) , @con decimal(30,20)
 
 
 
set @y = -48252.00000000000000000000
 
 
 
set @scaleFactor = 0.9999000000000000100000000
 
 
 
@con = @y/@scaleFactor
 
 
 
@con = -48256.82568256000000000000

cs

저 공식을 계산기로 연산할 경우


-48256.825682568256343066049779295 값이 나온다.


1
select -48252.000000000000/0.99990000000000001

cs


할 경우


-48256.8256825682563430 값이 나온다.


select로 연산할 경우와 계산기로 연산할 경우 일치한다.


* DECIMAL,NUMERIC


- NUMERIC 또는 DECIMAL 데이터 타입은 정확한 수치를 나타낸다. 다음과 같이 정밀도와 스케일을 옵션으로 지정하여

정의할 수도 있다. 정밀도 p가 생략되면 정밀도의 디폴트 값은 15, 스케일 s가 생략되면 스케일의 디폴트 값은 0이다. 정밀도의

최소값은 1이고, 최대값은 38이다.


decimal(p,[s])


decimal에 55555.3333을 지정하면 55555가 저장됨(스케일 디폴트 값은 0이므로 소수점 뒤의 수치는 모두 절삭됨).
decimal(5)에 555.33을 지정하면 555가 저장됨(스케일 디폴트 값은 0이므로 소수점 뒤의 수치는 모두 절삭됨).
decimal(9,4)에 55555.3333을 지정하면 55555.3333가 저장됨.
decimal(3,4)을 선언하면 오류가 발생됨 (정밀도가 스케일보다 작기 때문에 오류).
decimal(4,4)에 .533333을 지정하면 .5333가 저장됨(정밀도가 4이므로 소수점 4자리 밑은 절삭됨).




------------------------------------------------------------------------------------------------

declare @y decimal(8,2) , @scaleFactor decimal(20,17) , @con decimal(30,20)


로 수정할 경우


-48256.825682568256으로 연산 된다.


반응형