Q&A

  • MS-SQL 7.0에서 decimal field 문제
안녕하십니까?

델파이를 이용하여 업무 프로그램을 개발 중입니다.

숫자가 들어가는 필드가 필요해서 예전에는 float로 필드를 정하여 처리를 하였는데

소수점이 있는 숫자가 들어가면 DB에 정확한 갑이 저장되지 않더군요.

예를 들면 DBGrid에서 4.1이라고 넣으면 실제 DB에는 4.1000000003 과 같은 다른 값이 들어 가더군요. 게다가 어떤 경우에는 '다른 사용자가 사용중이기 때문에... (실제 메세지는 영어로 나와서 기억이 안나네요.)' 수정이나 삭제가 안되는 경우도 있었습니다.

이 문제를 해결하기 위해 여기 저기서 자료를 찾아보니 decimal 필드로 변환을 하면 가능하다고 해서 모든 테이블의 float 필드를 decimal로 바꿨습니다. 다른 DB는 안써봐서 모르겠지만 MS-SQL 7.0에는 decimal 필드인 경우는 소수점 자리수를 정하게 되어있더군요. 그래서 10자리로 고정시켰습니다. 이렇게 하니까 수정이나 삭제가 되지 않는 문제는 해결이 되었습니다.

그리고 소수점이 들어있는 숫자의 DB 저장문제도 대부분의 경우에는 제대로 되는데 유독 특별한 숫자들만 제대로 저장이 안됩니다. 그게 어떤 규칙이 있는 건 아닌거 같구요..

제가 알고 있는 숫자로는 8.2 가 있습니다. DB에는 8.1999999999 로 저장이 되더라구요.



도저히 방법을 찾을 수가 없네요. 어떻게 하면 해결할 수 있을까요?



고수님들의 도움이 절실합니다.

2  COMMENTS
  • Profile
    최수영 1999.10.22 17:50
    안재현 wrote:

    > 안녕하십니까?

    > 델파이를 이용하여 업무 프로그램을 개발 중입니다.

    > 숫자가 들어가는 필드가 필요해서 예전에는 float로 필드를 정하여 처리를 하였는데

    > 소수점이 있는 숫자가 들어가면 DB에 정확한 갑이 저장되지 않더군요.

    > 예를 들면 DBGrid에서 4.1이라고 넣으면 실제 DB에는 4.1000000003 과 같은 다른 값이 들어 가더군요. 게다가 어떤 경우에는 '다른 사용자가 사용중이기 때문에... (실제 메세지는 영어로 나와서 기억이 안나네요.)' 수정이나 삭제가 안되는 경우도 있었습니다.

    > 이 문제를 해결하기 위해 여기 저기서 자료를 찾아보니 decimal 필드로 변환을 하면 가능하다고 해서 모든 테이블의 float 필드를 decimal로 바꿨습니다. 다른 DB는 안써봐서 모르겠지만 MS-SQL 7.0에는 decimal 필드인 경우는 소수점 자리수를 정하게 되어있더군요. 그래서 10자리로 고정시켰습니다. 이렇게 하니까 수정이나 삭제가 되지 않는 문제는 해결이 되었습니다.

    > 그리고 소수점이 들어있는 숫자의 DB 저장문제도 대부분의 경우에는 제대로 되는데 유독 특별한 숫자들만 제대로 저장이 안됩니다. 그게 어떤 규칙이 있는 건 아닌거 같구요..

    > 제가 알고 있는 숫자로는 8.2 가 있습니다. DB에는 8.1999999999 로 저장이 되더라구요.

    >

    > 도저히 방법을 찾을 수가 없네요. 어떻게 하면 해결할 수 있을까요?

    >

    > 고수님들의 도움이 절실합니다.



    이상하네요! 저흰 사이베이스 11.0.2.2 For NT를 사용합니다! float라는 것은

    정확한 값이 아니라고 생각하시면 됩니다! 또한 Stored Procedure에서도

    지역변수를 사용하실때 기존 float타입을 decimal로 변환하시는 것 잊지마시고요..



    참고로 decimal(p,s)는 -10^38 to 10^38-1입니다!



    select 12/10 as message한번 테스트해보면 1.2가 아닌 1이나올겁니다!

    이런경우 10를 인식못하는 경우인데 이럴때는



    declare @i numeric(2,0)

    select 12/@i as message하면 정확히 1.2가 나올겁입니다! 이것이 그런 차이점이지요..

  • Profile
    안재현 1999.10.22 18:54
    최수영 wrote:



    > 이상하네요! 저흰 사이베이스 11.0.2.2 For NT를 사용합니다! float라는 것은

    > 정확한 값이 아니라고 생각하시면 됩니다! 또한 Stored Procedure에서도

    > 지역변수를 사용하실때 기존 float타입을 decimal로 변환하시는 것 잊지마시고요..

    >

    > 참고로 decimal(p,s)는 -10^38 to 10^38-1입니다!

    >

    > select 12/10 as message한번 테스트해보면 1.2가 아닌 1이나올겁니다!

    > 이런경우 10를 인식못하는 경우인데 이럴때는

    >

    > declare @i numeric(2,0)

    > select 12/@i as message하면 정확히 1.2가 나올겁입니다! 이것이 그런 차이점이지요..



    답변 감사드립니다.



    답변하신대로 Stored Procedure에서는 저도 decimal을 이용하고 있습니다.

    이미 입력된 데이타를 다루는 것은 문제가 없습니다.

    문제는 처음에 데이타를 입력할 때 문제가 생긴다는 겁니다.

    예를 들어 어떤 숫자를 델파이에서 계산해서 8.2라는 값이 나와서 이걸

    테이블에 저장할 때 FieldByName('fieldname').AsFloat := 값 이런 식으로

    쓰고 있습니다. 그 때 값을 저장하는 변수의 타입을 double, extended.. 뭘로해도

    같은 결과 그러니까 8.199999999가 나온다는 말입니다.

    그리고 그리드에서 직접 연결해서 사용을 해도 8.2를 넣으면 8.199999999로 값이

    바껴버립니다.

    다시한번 답변 부탁드립니다.