파이썬의 math

Choi Jimin·2023년 4월 16일

Python

목록 보기
8/8

프로그래머스 0단계 문제 중 '두 수의 나눗셈' 문제를 풀다가 궁금해진 내용이다.
math 모듈의 올림, 내림, 반올림 메소드들을 비교하고, 내림 메소드를 int() 함수와 비교해보자.

올림

ceil() 메소드가 있다.

import math

math.ceil(3.14)		# 4
math.ceil(-3.14)	# -3

내림

floor()trunc() 가 있다.

floor()

import math

math.floor(3.14)    # 3
math.floor(-3.14)	# -4

floor() 는 무조건 아래를 향해 내림한다.

trunc()

import math

math.floor(3.14)    # 3
math.trunc(-3.14)   # -3

trunc() 는 내림을 할 때 0으로 향한다. 즉, int() 와 같은 결과를 반환하는 함수이다.

  • math.trunc() vs int()

    python은 원시 타입 없이 모두 객체로, int()와 같이 형 변환을 하는 경우 새로운 객체를 생성한다.
    math.trunc() 도 마찬가지로 float에서 int로 형 변환을 해주는 함수로, 새로운 객체를 생성한다.
    두 함수 모두 소숫점을 기준으로 숫자를 자르는 방식을 사용한다고 한다. 따라서 두 함수 사용에 있어 더 좋고 나쁨은 크게 없을 것으로 예상된다. 굳이 따지자면 단순히 내림을 원할 경우에는 import를 안 해도 되는 int() 를 사용하는 것이 좋지 않을까 싶다.
    (+ 추가로, 어떤 사람이 본인의 컴퓨터에서 실험해본 결과 속도 측면에서는 math.trunc() 가 10% 정도 빠르다고 한다. https://stackoverflow.com/questions/52223610/when-is-it-better-to-use-trunc-instead-of-int-to-convert-floating-type-numbe)

python의 형 변환
C언어와 비교해보면, 형 변환으로 정수와 같은 원시 타입을 반환하는 경우, C언어는 원시 타입을 생성하지만 python은 객체를 생성한다.
원시 타입과 달리 객체는 해당 객체에 대한 메소드, 헤더 값 등의 추가로 생성되는 값들이 있기 때문에 메모리 소요도 더 크고 형 변환하는 시간도 더 오래 걸린다. 따라서 python에서 형 변환은 지양할 수 있으면 지양해야 한다.

반올림

round() 내장 함수가 있다.

round(3.1415)   # 3
round(3.1415, 2)   # 3.1
round(2131.415, -1)   # 2130.0
round(2131.415, -2)   # 2100.0

round에서 두 번째 인자가 음수(n-n 꼴)이면 (소숫점 기준) n-n의 자리에서 반올림을 한다.
즉, 정수 부분의 nn자리에서 반올림하는 것이다.
예를 들어 2131.4152131.415의 -1자리(일의 자리)에서 반올림하면 2130.0 된다.
마찬가지로, 2131.4152131.415의 -2자리(십의 자리)에서 반올림하면 2100.0 된다.

사사오입 원칙

round()는 사사오입 원칙을 따른다.
반올림할 자리의 수가 5일 때, 앞자리의 숫자가 짝수면 내림하고 홀수면 올림한다.

round(4.5)  # 4
round(3.5)  # 4

0개의 댓글