h99727   5년 전

처음에는 소수점으로 변환한 후

7, 1234567을 입력 (num, st)

함수 부분

  1. double형 st변수에 있는 입력 받은 데이터를 1.234567으로 만들어 box변수에 저장 후
  2. box에 있는 double 형 데이터를 int형으로 전환하여 소수점을 날린 정수 값만 가져와서 sum에 저장합니다
  3. st변수에 있는 정수 부분을 (int)box를 이용하여 빼고 (1.234567 - 1 = 0.234567)
  4. st변수에 있는 데이터를 10을 곱하여 소수점 첫 자리 수를 정수 부분으로 끌어냅니다
  5. 이후 다시 시행을 반복합니다

여기서 마지막 소수점 자리에서 double 형 데이터 저장이 7.00000으로 표시는 되지만 실제론 6.999999.....이렇게 되기 때문에

int형으로 소수 부분을 날리면 원래 의도했던 전체 값보다 1 작게 출력이 됩니다.

이 문제를 고치려 하니 문득 방향이 잘못된 것이 아닐까 생각 됩니다. 

제가 찾지 못했던 문제나 혹시 다른 방향이 있다면 조언 부탁 합니다.

djm03178   5년 전

부동소수점수는 언제나 오차가 생길 걱정을 해야 합니다. double이 그렇게 넓은 범위를 수를 담을 수 있는 건 오차를 내기 때문입니다. 아무리 긴 자리 수라도 오차 없이 깔끔하게 담아낼 수 있는 마법의 자료형이 아닙니다. 자세한 건 부동소수점의 표현 방식을 찾아보시면 될 것 같습니다.

h99727   5년 전

@djm03178

좋은 말 감사합니다

댓글을 작성하려면 로그인해야 합니다.