금액 등의 화폐값을 표시할 때 사이베이스에서 부정확한 소수점 결과를 보여주는 사례가 종종 발생함.
float은 수치연산에 부적합하며 double precision을 쓰라는 사이베이스 엔지니어의 권고를 받아들여
double precision으로 처리하였으나 역시 연산에 부정확함.
이 부정확하다는 것은 SQL 클라이언트툴에서 보여지는 결과값이 3.938인 경우(그리드형태) 이를 텍스트형태로 변환해 보거나 그리드의 셀을 더블클릭했을 때 3.9383828381 과 같은 결과가 나와 화면상에 3.9383828381 이 그대로 출력되어버리는 문제였음.
ASIS시스템은 sybase ASE 12.0 이며 노츠로 개발된 화면이었고 문제가 발생한 적이 없었다 함. 그러나 차세대는 sybase ASE 15.5이며 전자정부프레임워크+웹스퀘어 기반의 화면이나 문제가 발생하므로 아래와 같은 형태로 사이베이스 엔지니어가 조치를 취해 줌.
select CASE WHEN amt=0 THEN '0'
/*제약사항
double 경우 48개의 유효 자리 숫자 가짐.
Decimal 경우 38개의 유효 자리 숫자 가짐.
* 알고리즘
-- left 0 padding remove
select substring(ColumnName, patindex('%[^0]%',ColumnName), char_length(ColumnName) )
-- 오른쪽 0 padding remove
reverse ( left 0 padding (reverse (columnName) )
-- pattern index의 문제점
0.00000... 일 경우 처리 에러발생 --> case 문에서 분기처리
*/
ELSE reverse(substring(reverse( convert(VARCHAR, convert(DECIMAL(30,8), amt)) ), patindex('%[^0]%',reverse(convert(VARCHAR, convert(DECIMAL(30,8), amt)))), char_length( convert(VARCHAR, convert(DECIMAL(30,8), amt)))))
END AS AMT_STRING
FROM <table_name>
'사이베이스(ASE)' 카테고리의 다른 글
사이베이스 날짜 표현 형식 (0) | 2013.07.02 |
---|---|
사이베이스 암호화 (0) | 2013.07.02 |