더북(TheBook)

Knowhow | FLOAT형으로 인한 오류

이런 적이 있었다. 다른 기종의 DBMS에서 사용하던 테이블을 오라클에 생성한 뒤 데이터를 옮기는 작업을 하는데 숫자형 데이터를 입력하니 데이터가 잘려 들어간다며 원인을 파악해 달라는 요청을 받았다. 처음에는 데이터를 적재하는 프로시저에서 로직을 잘못 구현한 줄 알았는데, 알고 보니 FLOAT형이 문제였다. 예를 들어 보자.

입력

    CREATE TABLE ex2_4 (
           COL_FLOT1   FLOAT(32),
           COL_FLOT2   FLOAT
    );

결과

    table EX2_4이(가) 생성되었습니다.

입력

    INSERT INTO ex2_4 (col_flot1, col_flot2) VALUES (1234567891234, 1234567891234);

결과

    1개 행 이(가) 삽입되었습니다.

두 컬럼에 1,234,567,891,234란 값을 입력했는데, col_flot1에는 1,234,567,891,000, col_flot2에는 1,234,567,891,234가 들어갔다. 왜 첫 번째 컬럼에는 값이 잘려서 들어갔을까? [표 2-3]에 나와 있듯이 FLOAT(p)에서는 p에 들어가는 자릿수는 이진수가 기준이다. 즉 FLOAT(32)라고 해서 십진수 기준으로 32자리 숫자가 들어가는 것이 아니라 이진수 기준 32자리(10110100010… 식으로 32자리)가 들어간다. 이진수 기준 32자리를 십진수로 변환하려면 0.30103을 곱하면 된다. 따라서 32 * 0.30103 = 9.63296이고 1,234,567,891,234에서 열 번째 자리까지만 제대로 들어가고 나머지는 0으로 들어간 것이다. FLOAT 타입에서 p의 디폴트 값은 126이며, 126 * 0.30103 = 37.92978 이고 반올림하면 38, 즉 NUMBER 타입 p의 디폴트 값인 38이 나온다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.