본문 바로가기
Studying/Python

[Python] 내장함수 round 구현

by giem 2022. 5. 15.
반응형

Python에서 반올림을 필요로 하는 상황이 많다

 

우선 round 함수의 사용법을 보겠다

 

test = 1.74789

print(round(test))	#2
print(round(test, 3))	#1.748
print(round(-test, 2))	#-1.75

 

위의 예제처럼

첫 번째 인자에 반올림 할 수가 들어가고 두 번째 인자는 몇 번째 자리까지 사용할 건지에 대한 옵션이다.

 

두번째 인자가 들어가지 않거나 None이면 입력에 가장 가까운 정수로 반환한다

 

여기서 사용할 수식중 제곱연산과 나머지 연산에 대한 예시는 다음과 같다.

# 제곱 연산은 ** 연산자로 계산할 수 있다.
10 ** 2 == 100

# mod(나머지 연산)는 % 연산자로 계산할 수 있다.
5 % 2 == 1

 

위 정보들을 토대로 설계해보겠다.

 

우선 두번째 인자가 None일때는 0으로 초기화하고 시작한다.

 

그 후 1번째 인자에 2번째 인자에서 값을 준 만큼 소수점 자리를 옮겨서 뒤를 버리고

올림, 내림을 한 뒤 원래의 소수점 자리로 돌아오게 해준다.

설명이 어려운데 직접 코드로 보면 다음과 같다.

 

def my_round(number, ndgits=None):
  if ndgits is None:	#값 없을 시 0 초기화
    ndgits = 0
    
  mult = 10 ** (ndgits + 1)	# 소수점 자리 옮기기 위해 생성(10의 n승을 구함)
  eff = int(number * mult)	# 소수점 자리 버림

  if eff % 10 >=5:	# %연산으로 끝자리만 남긴 후 올림/내림 여부 판단
    eff += (10-eff%10)
  else:
    eff -= eff%10
  
  number = eff /mult # 원래의 소수점 자리로 돌려놓기

  return number

 

이해에 도움이 되도록 라인마다 comment를 써놓았다.

 

잘 구현되었는지 테스트를 해보면

 

test = 1.74789

assert round(test) == my_round(test)
assert round(test, 3) == my_round(test, 3)
assert round(-test, 2) == my_round(-test, 2)

 

잘 동작하는 것을 볼 수 있다.

반응형

'Studying > Python' 카테고리의 다른 글

[Python] 내장함수 range 구현  (0) 2022.05.18
[Python] 내장함수 max, min 구현  (0) 2022.05.16
[Python] 내장함수 enumerate 구현  (0) 2022.05.15
[Python] 내장함수 abs 구현  (0) 2022.05.13
[Python] 내장함수 all 구현  (0) 2022.05.12

댓글