• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

%f 관련 질문입니다. (자리수)

21.01.25 15:26 작성 조회수 933

0

궁금한 점

- print('%10.2f' % (12345.141592653589793))를 예로 들어보면,

-   12345.14

- 로 총 10자리에 소수점 2자리로 의도했던 대로 나오지만,

print('%10.2f' % (123456789.141592653589793))를 예로 들어보면,

- 123456789.14

- 가 나와서, 전체 자리수 제한이 걸리지 않는데 왜 그러는건가요?

- 그냥 정수부 자리수가 총 자리수 제한을 초과하면 소수점 자리만 신경쓰는건가요?

답변 5

·

답변을 작성해보세요.

0

PARK JUNYEONG님의 프로필

PARK JUNYEONG

2021.01.26

네 저도 그렇게 이해를 했습니다!

0

jyi4719님의 프로필

jyi4719

질문자

2021.01.26

감사합니다! 그렇다면 이제

%전체길이.소수점의 나오는 개수

  • .(점)을 기준으로 
  • 점 앞부분은 전체 길이(총 자릿수)를 담당
  • 점 뒷부분은 실수(float)이면서 소수점의 나오는 개수를 담당

정수부의 길이가 길어서 출력의 자릿수가 지정했던 총 자릿수를 초과하게 되면 초과한 만큼을 그대로 출력한다.

라고 이해하면 될까요?

보통은 소수점 이하 N자리 제한을 많이 거는 편이니 정수의 자리수는 크게 신경 안써도 되겠네요!

0

PARK JUNYEONG님의 프로필

PARK JUNYEONG

2021.01.26

저는 강사님이 아니고 학생입니다.

저도 배워가는 처지고 배운 것 중에 제가 답변할 수 있는 질문게시물에는 답변해드리려고 노력 중입니다!

비슷비슷한 내용이 인프런에 있을 수 있지만, 

답변이 달린 내용을 보다면 미묘하게 자기가 질문하려고 하는 부분이 다를 수 있습니다.

이 부분에 대해서는 먼저 검색(구글링, stackoverflow 등)을 통해 찾아보시고,

그다음에 질문을 하는 것도 나쁘지 않습니다 :)

----------------------------------------------------------

저도 이 부분을 잘 몰라서 구글링한 결과 (https://dojang.io/mod/page/view.php?id=2300)

실수는 점을 기준으로 점 앞은 정렬할 길이 지정하고, 점 뒤는 소수점 이하의 자릿수 지정한다고 합니다.

곰곰이 생각해봤는데 정렬할 길이 지정이라는 부분은 하나의 약속 같은 개념이 아닐까요?

총 자릿수10이고 소수점의 나오는 개수2개입니다.

Colab을 돌리면서 혹시나 하는 마음에 len을 사용하여 확인 길이를 확인해봤습니다.

공란을 0으로 채우는건 이해하셨다고 하니 공란을 0으로 사용하겠습니다.

print('%010.2f' % (.141592653589793))
print("길이 : ",len('%010.2f' % (.141592653589793)),"\n")

print('%010.2f' % (1.141592653589793))
print("길이 : ",len('%010.2f' % (1.141592653589793)),"\n")

print('%010.2f' % (12345.141592653589793))
print("길이 : ",len('%010.2f' % (12345.141592653589793)),"\n")

print('%010.2f' % (123456789.141592653589793))
print("길이 : ",len('%010.2f' % (123456789.141592653589793)),"\n")

#출력 결과

#0000000.14
#길이 :  10 
#
#0000001.14
#길이 :  10 
#
#0012345.14
#길이 :  10 
#
#123456789.14
#길이 :  12 

이로써 어떤 숫자를 정렬할 길이로 지정하면

정수 부분이 0개, 1개 상관없이 .(점), 소수점 자리 이하까지 포함한 총 자릿수는 보장한다는 것을 알 수 있습니다!

만약 정수 부분이 지정한 것보다 길게 입력했다면

보장하는 범위를 넘어가기 때문에 초과한 만큼 출력을 하는 것입니다.

----------------------------------------------------------

제가 예시로 든 

%전체길이.소수점의 나오는 갯수

  • 앞부분은 정수(int)이면서 전체 길이(총 자릿수)를 담당하고,
  • 뒷부분은 실수(float)이면서 소수점의 나오는 갯수를 담당

이것도 어느 정도 맞는 말입니다!

다만, .(점)을 기준으로 한다는 게 없었던 것요약으로 한 설명이 모호했었네요....

이제는 이렇게 작성해야겠네요 :)

%전체길이.소수점의 나오는 개수

  • .(점)을 기준으로 
  • 점 앞부분은 전체 길이(총 자릿수)를 담당
  • 점 뒷부분은 실수(float)이면서 소수점의 나오는 개수를 담당

----------------------------------------------------------

저도 개념이 정확한지 안 한 지 몰라 일단 제가 아는 선에 대해 저렇게 작성을 했던 것이고,

혹시나 강사님 보시면 제가 몰랐던 부분을 저런 식으로 ps.를 통해 질문을 작성한 것입니다.

0

jyi4719님의 프로필

jyi4719

질문자

2021.01.25

공란을 0으로 채우는 건 이해했는데..

보여주신 예시에서 첫번째 프린트문과 세번째 프린트문 모두 '%10.2f'인데

첫번째 프린트문의 '%10.2f'의 출력결과는 '123456789.14'로 총 12자리가 나오고 (정수부 9자리 + 소수부 2자리 + . 1자리)

세번째 프린트문의 '%10.2f'의 출력결과는 '  12345.14'로 총 10자리가 나옵니다. (정수부 공백 포함 7자리 + 소수부 2자리 + . 1자리)

이는,  말씀하신 %전체길이.소수점의 나오는 갯수

  • 앞부분은 정수(int)이면서 전체 길이(총 자릿수)를 담당하고,
  • 뒷부분은 실수(float)이면서 소수점의 나오는 갯수를 담당

과 부합하지 않는 예시라고 생각합니다.

이와 관련된 비슷한 질문이 많은데 그 어디에도 명확한 답변이 없어 질문 드립니다.

0

PARK JUNYEONG님의 프로필

PARK JUNYEONG

2021.01.25

%전체길이.소수점의 나오는 갯수

  • 앞부분은 정수(int)이면서 전체 길이(총 자릿수)를 담당하고,
  • 뒷부분은 실수(float)이면서 소수점의 나오는 갯수를 담당

로 알고있습니다.

그럼 %10.2f를 해석하면

총 자리수는 10이고 소수점의 나오는 갯수는 2개입니다.

print('%10.2f' % (123456789.141592653589793))
print('%010.2f' % (123456789.141592653589793))
print()
print('%10.2f' % (12345.141592653589793))
print('%010.2f' % (12345.141592653589793))

#출력결과
#123456789.14
#123456789.14
#
#  12345.14
#0012345.14

앞에 0을 부착한 이유는 나머지부분을 0으로 표현하기 위해서 부착하였습니다.

그리고 읽어보시고 이해가 안되시면 답글 남겨주세요!

그럼, 강사님이 좀 더 알려주실 거예요!

-----------------------------------------------------------

ps. 강사님 jyi4719님 답글 작성 중에 궁금한 점이 있습니다!

총 자리수를 카운트를 할 때 0부터 시작해서 카운트를 하는건가요?

또한, 소수점을 포함해야하나요?

123456789.14인 경우

(123456789)(.)(14) 이렇게 3등분으로 나눠서 카운트를 하는건가요?

정수부분 8자리 (0부터 시작) / . 1자리 / 실수부분 1자리

그래서 총 10자리인지 궁금합니다!

-----------------------------------------------------------

도움이 되었으면 우측하단 또는 좌측하단에 하트 한번만 눌러주세요 :)