알고리즘 문제들 으악/백준

[python]4344번, 무조건 소수점 n자리 나오게 하기

빈나 2022. 3. 21. 20:47
반응형

4344번을 풀면서 하나의 반례가 생겼다.

나는 소수점 3자리까지만 표현 하라고 해서 round이용 하여 풀었다.

그러나 round에서 반례는 40.000000...과 같은 값은 그냥 40.0으로 출력하고 만다. round(40.00000...,3)해도 말이다.

그래서 검색 결과 새로운 표현 방법을 찾았다(사실 새롭다기보다는 그냥 기록안하고 넘어간 탓이 크다)

내가 표현이 틀리고 부정확할 수 있기 때문에 원본 글을 첨부 한다

https://dojang.io/mod/page/view.php?id=2300 

 

파이썬 코딩 도장: 24.2 문자열 서식 지정자와 포매팅 사용하기

파이썬은 다양한 방법으로 문자열을 만들 수 있습니다. 그중에서 서식 지정자(format specifier)로 문자열을 만드는 방법과 format 메서드로 문자열을 만드는 문자열 포매팅(string formatting)에 대해 알아

dojang.io

그러나 파이썬 반올림에는 허점이 존재했다.

5로 끝나는 소수점에는 우리가 아는 4사5입이 아닌 다른방식으로 구현되어있다.

 

소수점 첫째자리는 정수자리가 홀,짝이냐에 따라 올림,내림이 결정되었지만 소수점 자리 올림,내림경우 또 다른 방식으로 결정되었다.

 

결국 5로 끝나는 소수점의 반올림은 무조건 올림이 아니기에 원하는 결과값이 안나올수 있어 따로 함수를 구현하여 풀이를 하였다.

이때도 조심했던것이, 직접 구현하다가 소수점 끝자리가 0이 되어버리면 소수값이 사라져 아래와 같은 방법으로 고정시켜야했다.(이걸 놓쳐 또 해멨다)

 

내가 공부한 바, 2가지 표현 방식이 있다

1.

print('%08.2f' % 3.6)

08은 실수의 갯수를 뜻하고 2f는 소수점 자리 개수를 나타낸다. 따라서 8개의 실수와 2개의 소수점 자리를 갖는다.

3.6은 자기가 변환하고자 하는 숫자를 넣는것이다.

출력 결과는

00003.60이 나온다

의아해 할 수 도 있다. 왜 0갯수가 7개가 아니라 4개인지.

8개의 실수의 의미는 정수개수, 소수점 자체, 소수점 자리수까지 포함해서 8개인것이다!

여기서 만약 실수의 개수를 굳이 설정 안하고 싶다! 하면 그냥 생략하고 '.2f' % 3.6.도 가능하다

 

2.

print('{0:08.2f}'.format(150.37)

출력할때 format을 이용한 것 같다.

:을 기준으로 왼쪽의 0은 제목이나 인덱싱을 나타낸다고 한다. 굳이 필요없으면 생략할 수 있어 :만 적고 넘어가자

앞에와 같이 08은 실수 개수 2f은 소수점 자리, format안은 변환하고자 하는 숫자를 넣으면 된다. 

반응형