Q&A

  • DBGrid 소수점 에러
안녕하세요.. 고수님들.

아무리 봐도 해결이 안되는 부분이 있어서 여쭤봅니다.

소수이하 입력을 하면 값이 짤려서 들어가는 현상이 있습니다.
예를들어 10.2를 입력하면 10.199로 10.7은 10.699로
값이 들어가는데 해결 방법은 없나요?

제가 해본 소스는 이겁니다.

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
var sqty : String;
begin
  if ((DBGrid1.Columns[9].Index = 9)  and (Key = #13 ))then
  begin
    Query1.Edit;
    sqty := FormatFloat('#0.0006', Query1.FieldByName('qty').AsFloat);
    Query1.FieldByName('qty').AsCurrency := RoundTo(StrToCurr(sqty), -4);
  end;
end;

해결방법 좀 부탁드립니다.

참고로 델버전은 5.0 DB는 mssql입니다.
5  COMMENTS
  • Profile
    주웰 2005.05.12 20:32
    책에서 봤는데요
    컴퓨터는 0, 1로만 계산을 해서 그러하다고 하더군요.

    한예로 currency type으로 선언된 변수에

    0.1을 10번 더하면 답은 1이 아닙니다.

    0.99... 이런식으로 되죠.

    currency type으로 읽고쓰셔서 그런것 같은데요.

  • Profile
    최용일 2005.05.12 19:50
    안녕하세요. 최용일입니다.

    이러한 문제는 델파이 뿐만아니라 C, VB, ... 등등 모든 컴파일러가 가지고 있는 문제입니다...

    정확히 말하면... 컴파일러나 DB문제가 아니라.. 컴퓨터 문제죠...

    현재 나와 있는 CPU중에서 실수를 정확히 표시할 수 있는 것은 존재하지 않습니다.

    0.2, 0.7 1/3 이런것들을 정확히 메모리에 저장하는데는 한계가 있습니다.

    때문에 그 수에 최대한 가까운 수를 이용해서 저장을 하는데... 오차가 없을수가 없습니다.

    디비에 저장한 값을 읽어와서 표시할때... 반올림등을 이용해서... 유효자릿수에 맞게 처리를 해주시는 방법이 제일 좋을듯합니다.

    ^^ 항상 즐코하세요...

  • Profile
    홍홍 2005.05.12 22:01
    먼저 답변을 달아주셔서 감사합니다.
    하지만 의문이 풀리지 않아 시삽님께 다시 여쭤봅니다.
    해당 문제는 모든 컴파일러가 가지고 있는 문제라고 하셨는데
    정말 해결 방법은 없는건가요? db자체에 값이 제대로 들어가야 합니다.
    현재 이 부분은 재고쪽 수량이 소수이하 3자리까지 표기되어야 하는 부분이여서
    반올림등으로 해결할 수 있는 부분이 아닙니다.
    vb에서는 소수로 인한 문제가 발생된 적이 없다고 하던데 (제가 테스트를 직접해보진 못했습니다만)
    델파이가 버전 up이 되면서 해당 부분에 대해서도 어떤 조취가 있었을 것 같다고 생각됩니다.
    (제 개인적인 생각입니다만)
    바쁘시겠지만 다시 한번 답변 부탁드립니다.

  • Profile
    최용일 2005.05.13 01:06
    글쎄요... VB에[서 소수로 인한 문제가 발생된적이 없다는것은.. 좀처럼 믿기 힘들군요...
    VC도 이러한 문제를 가지고 있는데... VB에서 해결된것을 VC에 반영을 안했을리가....

    이건 CPU자체의 한계인데... 컴파일러에서 소수(실수)를 표시하는 자료형... 대부분 최대 약 10바이트정도인데... 이 10바이트정도되는것 가지고 얼마나 많은 수를 표시할 수 있겠습니까?

    MS-SQL도움말 보셔도 아시겠지만... 컴퓨터에서 다루는 실수는 유효자리수가 있습니다. 왜 있는지는 아래 내용보시고 생각해보세요...

    아래는 MS-SQL헬프에 있는 내용입니다.

    float 및 real
    부동 소수점 숫자 데이터에 사용하는 근사 숫자 데이터 형식입니다. 부동 소수점 데이터는 근사값입니다. 데이터 형식 범위의 모든 값을 정확하게 표시할 수는 없습니다.


    재고쪽 수량이 소수이하 3자리까지 표시되어야 된다면.. 유효자릿수가 3자리인데...
    소수이하 4번째자리에서 반올림을하시면... VB와 똑같이 될거라고 생각되네요...

    ^^ 항상 즐코하세요...

  • Profile
    홍홍 2005.05.13 03:31
    답변 감사합니다.
    소수이하 4번째 자리에서 반올림 해서 사용하는 방법외에는 없는 것 같네요...
    혹시나 하고 여쭤본건데 아쉽습니다.



    • 모영철
      2005.05.13 21:57
      FormCreate 에서 초기화 해 주시면 되겠습니다. 아니면 Const    check1 : integer = 1; ...
    • 김종윤
      2005.05.13 23:10
      정말정말 감사합니다 ^^
    • 메니아
    • 2005.05.13 02:10
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 2005.05.13 01:34
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 모영철
      2005.05.13 18:01
      보통 그런거 메신져에서 많이 사용하자나요? 시작하자마자 로그인... 메신져들은 그냥 시작후 몇십초...
    • 몰파이
    • 2005.05.12 22:51
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2005.05.13 01:28
      안녕하세요. 최용일입니다. 바꾸시는것은 간단합니다. 자동으로 만들어진 DBEdit의 DataSource와 Dat...
    • 도깨비
      2005.05.13 01:08
      query컴포넌트의 SQL property에 select * from table where id=:ID 라고 넣으시고, 소스코딩시 ...
    • 김종윤
      2005.05.13 01:26
      아 정말 너무 너무 원하던 답이었어요. 가슴이 시원해 지네요 ^^ 너무 고맙습니다.
    • 성길
    • 2005.05.12 18:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 성길
      2005.05.12 19:51
      코드를 아래와 같이 수정해서 성공했습니다 ^^v <!--CodeS--> procedure TActiveFormX.Button1Cl...
    • 홍홍
    • 2005.05.12 04:08
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 주웰
      2005.05.12 20:32
      책에서 봤는데요 컴퓨터는 0, 1로만 계산을 해서 그러하다고 하더군요. 한예로 currency type으로 선언...
    • 최용일
      2005.05.12 19:50
      안녕하세요. 최용일입니다. 이러한 문제는 델파이 뿐만아니라 C, VB, ... 등등 모든 컴파일러가 가지고 ...
    • 홍홍
      2005.05.12 22:01
      먼저 답변을 달아주셔서 감사합니다. 하지만 의문이 풀리지 않아 시삽님께 다시 여쭤봅니다. 해당 문제는...
    • 최용일
      2005.05.13 01:06
      글쎄요... VB에[서 소수로 인한 문제가 발생된적이 없다는것은.. 좀처럼 믿기 힘들군요... VC도 이러한 문...
    • 홍홍
      2005.05.13 03:31
      답변 감사합니다. 소수이하 4번째 자리에서 반올림 해서 사용하는 방법외에는 없는 것 같네요... 혹시나 ...
    • 윤수아
      2005.05.12 19:30
      SQLINT32.DLL InterBase SQL Links driver 라고 하는군요.. BDE 설치하면 깔리는 화일인데... BDE를 최...
    • 몰파이
      2005.05.12 22:44
    • akc
    • 2005.05.11 20:44
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 윤수아
      2005.05.12 01:05
      윗분 답변처럼 해주시면 되요.. 그리고 동적으로 생성하면...property도 다 코딩으로 하셔야 하니까... ...
    • 주웰
      2005.05.11 23:45
      허접한 실력으로 한번 코딩 해봤습니다. 저두 델파이가 미흡해서요 먼저 알아 두셔야 할것은 ondblcl...
    • akc
      2005.05.20 16:36
    • 고진중
    • 2005.05.11 19:40
    • 3 COMMENTS
    • /
    • 0 LIKES
    • leesteel
      2005.05.11 22:02
      keypress Event 에 아래와 같이 해주시면... <!--CodeS-->   if (Key >= 'a') and ...
    • 엠피쓰리
      2005.05.11 22:57
      반대는 어떻게 할까요......??
    • 윤수아
      2005.05.14 02:31
      procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin   if key < #164...
    • 주웰
      2005.05.11 22:45
      퀵레포트 말고 Rave 레포트는 바코드 가능합니다. 프로젝트도 해봤고요. 자료가 많이 없을것입니다. To...
    • 김재현
    • 2005.05.11 02:23
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 메니아
    • 2005.05.11 02:04
    • 7 COMMENTS
    • /
    • 0 LIKES
    • 권태훈
      2005.05.11 02:22
    • 메니아
      2005.05.11 05:19
    • 권태훈
      2005.05.11 20:52
    • 메니아
      2005.05.11 22:07
    • 권태훈
      2005.05.12 03:45
    • 메니아
      2005.05.13 02:07
    • 권태훈
      2005.05.14 21:47
    • 이광준
    • 2005.05.11 01:25
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 도끼로이마까
      2005.05.11 01:35
      <!--CodeS--> var   fm: TNewForm; begin   fm := TNewForm.Create(Self); ...
    • 이광준
      2005.05.13 21:18
      답변감사합니다...
    • 이중철
      2005.05.10 21:48
    • 김종윤
      2005.05.10 22:24
    • 주웰
      2005.05.10 23:02
    • 김종윤
      2005.05.11 01:12
    • 주웰
      2005.05.11 22:27
    • 김종윤
      2005.05.12 01:29
    • 갑도리
    • 2005.05.10 19:24
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 윤수아
      2005.05.12 01:11
      ocx 화일 자체를 올리시면 답변이 많아질거에요... 저도 직접 등록해봐야지..알 수 있을 것 같구요.. 저 ...
    • 갑도리
    • 2005.05.10 19:13
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 권황중
      2005.05.11 22:14
      내 생각에는 요번에 나온 델파이 2005가 좋을듯 하네요. 닷넷과 WIN32 둘다 되니.. 오히려 2개를 구입...
    • 도끼로이마까
      2005.05.11 01:37
      6.0 pro를 사셔도 충분하리라 봅니다... 패키지의 차이는 볼랜드 웹사이트를 보심이...
    • 정재성
    • 2005.05.10 05:00
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박성환
      2005.05.14 03:06
      레포트를 작성한 폼이 보이는데 안보이고 싶다는 말씀인지요... Application.CreateForm(TfrmMwareRep ,...