Double 소수점 표기 , 데이터베이스와 소스상의 표기 차이

     


서버에서 데이터를 처리하다보면 데이터 형(data type) 때문에 짜증나는 경우가 한 두번이 아니다. 


최근에 해외주식 데이터를 작업하면서 소수점 표기에 문제가 발생했는데, 국내의 경우 단위가 원이기 때문에 소수점이 없지만, 해외의 경우 소수점단위로 거래가 되기 때문에 모든 값을 Double로 선언해야 한다. 근데 분명히 소스 로그상에는 Double로 깨끗하게 찍히던 값들이 DB에만 들어가면 소수점 뒤로 이상한 값이 찍히는 것이다.


예를들어 로그에서는 4.240000 으로 나오던 값이 DB에 들어가니 4.24000000002 이런식으로 나온다. ㅂㄷㅂㄷ...





원인은 DB (알티베이스)의 데이터 형의 문제인데, 실제로 Altibase에서의 Double의 소수점 표기범위와 서버 랭귀지(C언어)의 Double의 소수점 표기 범위가 달라서 이상한 값이 들어가고 있다.


Altibase 메뉴얼에는 이런경우를 대비해 Numeric이라는 자료형 사용을 권장하고 있다. Numeric 자료형은 정수범위와 소수범위를 지정할 수 있는 고정소수점 표기형이다. 예를들어 정수부분 4자리 소수점 이하 5자리를 원하면 Numeric(4,5)로 표기하면 된다.


이렇게 형변환 하는 방법도 있지만 소스상에서 처리하는 방법도 있다.

나같은 경우는 소스에서 아래와 같은 방법으로 소수점 2자리 이하를 잘랐다.


data = floor(data * 100) / 100;


floor는 C언어에서 소수점이하 버림 메소드이다.

기존 double형 data에 100을 곱한후 소수점이하를 버리고 다시 100으로 나누면 소수점 2자리인 double이 완성된다. 만약 소수점 3자리를 원하면 1000을 곱하고 나누면 된다.




만약 소수점 이하 표기가 데이터마다 다르다면 적용할 수 없는 방법이지만, 내가 사용하는 데이터는 소수점 2자리까지만 표기하면 되기 때문에 위와같은 방법을 적용했다. 변동 소수점 데이터라면 필요로 하는 가장 큰 자리수로 나누거나 다른 방법을 찾아야 할 것같다.

반응형

댓글

Designed by JB FACTORY