본문 바로가기

Computer/Python

파이썬 실수 내림/올림

반응형

파이썬의 math 내장 라이브러리의 floor/ceil 함수는 각각 인자로 주어진 실수를 내림/올림하는 함수로서 실수를 받아 정수를 리턴합니다.

from math import ceil, floor, log10
>>> floor(1.025), ceil(1.025)
(1, 2)

하지만 실수에 대해서 소수점 몇번째 자리에서 내림/올림 등을 수행하고 싶을 때가 있는데요, 이러한 경우에는 floor/ceil 함수를 이용해 약간의 수학적인 트릭을 이용해야 합니다.


먼저 소수점 자리에 대해서 처음으로 0이 아닌 자리에 대해 내림/올림을 수행해보도록 하겠습니다. 예를 들어 0.001575라면 0.002이 되는 것이죠. 따라서 소수에 대해서 처음으로 0이 아닌 자리를 찾아야하는데 이는 밑이 10인 로그를 취하고 floor 내림 함수를 적용하면 됩니다.

>>> abs(math.floor(math.log10(0.001575)))
3

올림 (ceil)을 적용한다고 가정했을 때 결과가 0.002이 되어야합니다. ceil 함수가 올림 이후의 정수를 리턴하기에 0.001575에 10^3을 곱한 이후에 ceil 함수를 적용하면 2가 되고 이를 다시 10^3으로 나누면 0.002 이 되겠죠. 이를 코드로 구현하면 다음과 같습니다. 만약 해당 실수가 1.0보다 크다면 정수 부분을 int 함수로 구해 빼준 이후에 진행하면 됩니다.

>>> from math import log10, floor, ceil
>>> value = 0.001575
>>> places = abs(floor(log10(value)))
>>> ceil(value*(10**places)) / float(10**places)
0.002

이제 정수에 대해서 생각해 보겠습니다. 123456 정수에 대해서 천의 자리에 대해서 올림을 수행하면 124000이 되어야 합니다. 이때는 위의 소수점과 반대로 1000을 나눈 후에 ceil 함수를 적용한 뒤 다시 1000을 곱해주면 됩니다. 즉, 나눗셈과 곱하기의 순서가 다음과 같이 바뀌는 것이죠. 내림에 대해서도 ceil 함수가 floor 함수로 바뀔 뿐 나머지는 동일합니다.

>>> value = 123456
>>> ceil(value/(10**3)) * float(10**3)
124000.0
반응형

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

Vectorization  (0) 2021.08.14
"is" vs "=="  (0) 2021.08.11
Shallow copy vs Deep copy  (0) 2021.08.01
List Subtraction  (0) 2021.07.26
파이썬의 GIL 사용 이유  (2) 2021.07.24