Q&A

  • [급]소숫점이 있는 수의 계산식 문제
procedure TForm1.Button1Click(Sender: TObject);

var

i : Double;

k : Integer;

begin

i := 0;



for k := 1 to 300 do

begin

i := i + 0.01;

RichEdit1.Lines.Add(FloatToStr(i));

end;

end;



이 문장을 실행시키면 결과가 아래 같이 나옵니다.

그런데 왜 0.75 다음에 0.760000000000001 이 나오는 걸까요?

이유좀 가르켜 주세요.. 소숫점 셋째자리에서 반올림 하란 소리는 말고요~



0.01

0.02

0.03

0.04

0.05

0.06

0.07

0.08

0.09

0.1

0.11

0.12

0.13

0.14

0.15

0.16

0.17

0.18

0.19

0.2

0.21

0.22

0.23

0.24

0.25

0.26

0.27

0.28

0.29

0.3

0.31

0.32

0.33

0.34

0.35

0.36

0.37

0.38

0.39

0.4

0.41

0.42

0.43

0.44

0.45

0.46

0.47

0.48

0.49

0.5

0.51

0.52

0.53

0.54

0.55

0.56

0.57

0.58

0.59

0.6

0.61

0.62

0.63

0.64

0.65

0.66

0.67

0.68

0.69

0.7

0.71

0.72

0.73

0.74

0.75

0.760000000000001

0.770000000000001

0.780000000000001

0.790000000000001

0.800000000000001

0.810000000000001

0.820000000000001

0.830000000000001

0.840000000000001

0.850000000000001

0.860000000000001

0.870000000000001

0.880000000000001

0.890000000000001

0.900000000000001

0.910000000000001

0.920000000000001

0.930000000000001

0.940000000000001

0.950000000000001

0.960000000000001

0.970000000000001

0.980000000000001

0.990000000000001

1

1.01

1.02

1.03

1.04

1.05

1.06

1.07

1.08

1.09

1.1

1.11

1.12

1.13

1.14

1.15

1.16

1.17

1.18

1.19

1.2

1.21

1.22

1.23

1.24

1.25

1.26

1.27

1.28

1.29

1.3

1.31

1.32

1.33

1.34

1.35

1.36

1.37

1.38

1.39

1.4

1.41

1.42

1.43

1.44

1.45

1.46

1.47

1.48

1.49

1.5

1.51

1.52

1.53

1.54

1.55

1.56

1.57

1.58

1.59

1.6

1.61

1.62

1.63

1.64

1.65

1.66

1.67

1.68

1.69

1.7

1.71

1.72

1.73

1.74

1.75

1.76

1.77

1.78

1.79

1.8

1.81

1.82

1.83

1.84

1.85

1.86

1.87

1.88

1.89

1.9

1.91

1.92

1.93

1.94

1.95

1.96

1.97

1.98

1.99

2

2.01

2.02

2.03

2.04

2.05

2.06

2.07

2.08

2.09

2.1

2.11

2.12

2.13

2.14

2.15

2.16

2.17

2.18

2.19

2.2

2.21

2.22

2.23

2.24

2.25

2.26

2.27

2.28

2.29

2.29999999999999

2.30999999999999

2.31999999999999

2.32999999999999

2.33999999999999

2.34999999999999

2.35999999999999

2.36999999999999

2.37999999999999

2.38999999999999

2.39999999999999

2.40999999999999

2.41999999999999

2.42999999999999

2.43999999999999

2.44999999999999

2.45999999999999

2.46999999999999

2.47999999999999

2.48999999999999

2.49999999999999

2.50999999999999

2.51999999999999

2.52999999999999

2.53999999999999

2.54999999999999

2.55999999999999

2.56999999999999

2.57999999999999

2.58999999999999

2.59999999999999

2.60999999999999

2.61999999999999

2.62999999999999

2.63999999999999

2.64999999999999

2.65999999999999

2.66999999999999

2.67999999999999

2.68999999999999

2.69999999999999

2.70999999999999

2.71999999999999

2.72999999999999

2.73999999999999

2.74999999999999

2.75999999999999

2.76999999999998

2.77999999999998

2.78999999999998

2.79999999999998

2.80999999999998

2.81999999999998

2.82999999999998

2.83999999999998

2.84999999999998

2.85999999999998

2.86999999999998

2.87999999999998

2.88999999999998

2.89999999999998

2.90999999999998

2.91999999999998

2.92999999999998

2.93999999999998

2.94999999999998

2.95999999999998

2.96999999999998

2.97999999999998

2.98999999999998

2.99999999999998



1  COMMENTS
  • Profile
    홍성락 2001.12.13 01:57
    cabinj wrote:

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > i : Double;

    > k : Integer;

    > begin

    > i := 0;

    >

    > for k := 1 to 300 do

    > begin

    > i := i + 0.01;

    > RichEdit1.Lines.Add(FloatToStr(i));

    > end;

    > end;

    >

    > 이 문장을 실행시키면 결과가 아래 같이 나옵니다.

    > 그런데 왜 0.75 다음에 0.760000000000001 이 나오는 걸까요?

    > 이유좀 가르켜 주세요.. 소숫점 셋째자리에서 반올림 하란 소리는 말고요~

    >

    > 0.01

    > 0.02

    ...

    > 0.75

    > 0.760000000000001

    > 0.770000000000001

    ////////////////////////////////////////////////////////////////

    FloatToStr가원래 Extended형의 실수로 정확도(significant digits.)는 15이고 general number format이므로 Double형이 안맞는 경우가 발생합니다.

    그래서

    1.FloatToStrF를 사용하되 general number format이 아닌 ffFixed로사용하시구요

    2.또는, FormatFloat등 일반 Format류의함수를 사용하시면됩니다.

    아니면

    3. 위 변수 i를 Extended형으로 사용하시면됩니다.



    4.FloatToStr대신 CurrToStr함수를 사용해보시던지요.



    다른방법도 많을겁니다.