안녕하십니까 .. 고수님의 조언바랍니다.
아래프로그램에서 aaa라는 클래스를 만든뒤 그 클래스의 double형 변수drate에
0.052 라는 값을 넣어주었읍니다. 그런데 aaa[1].drate 의 내용을 보면
0.052가이닌 0.05199999999999976 이 나옵니다.
왜그런지 알고싶습니다....T_T
procedure TForm1.Button1Click(Sender: TObject);
type
trate = record
sname : string;
drate : double;
end;
var
aaa : array[1..10] of trate;
begin
aaa[1].sname := 'asdfg';
aaa[1].drate := 0.052;
end;
1. 님께서 선언하신 trate 는 class 가 아니고 Record 입니다.
Class 로 선언하실려면.
TRate = class
sname: String;
drate: double;
end;
라고 해 주셔야 합니다. 그리고 사용할 때..
var
i: Integer;
aaa: Array[1..10] of TRate;
begin
for i:=1 to 10 do
aaa[i] := TRate.create;
aaa[1].sname := 'asdfg';
aaa[1].drate := 0.052;
end;
라고 구현하셔야겠죠.
2. 님께서 값을 넣는 방법은 Class 와 관계 없구요.
Double = Non-Fixed Point Value 라서 그렇습니다.
즉, 얼마 소수점까지 사용하겠다는 정의를 하지 않는 실수라 그럽니다.
0.05199999999999976 라고 값이 나오는건.. 저도 정확히는 모르는데.
메모리에서 실수값을 기록하는 방식과 사람이 사용하는 방식간의
차이 때문에 생기는 문제로 알고 있습니다.
예를 들어 1/3 은 사람에게는 명확한 수이지만 컴퓨터가 Bit 로
그 수를 명확히 가지기는 까다로운 수이지 않을까여 ?
때로는 그 차이가 버그로 인식되기도 하고 Intel 칩의 구조적 문제로
논의되기도 하는 것으로 알고 있습니다.
제가 알기론, 일반적으로 "버그" 라고는 분류하지 않는 문제로 알고
있습니다.
정확한 실수값에 대한 부분은 다른 답변을 참조하시길 바랍니다.
도움이 되길 바랍니다.
이준해