Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 fractions 모듈 완벽 가이드: 분수 생성부터 연산까지

파이썬 fractions 모듈이란?

파이썬(Python)의 fractions 모듈은 유리수(rational number) 연산을 지원하는 표준 라이브러리입니다. 이 모듈을 활용하면 정수, 실수(float), Decimal 객체는 물론 문자열 형태의 숫자 값까지 다양한 방식으로 분수를 생성할 수 있습니다.

분수 인스턴스(Fraction Instance)는 분자(numerator)와 분모(denominator)에 해당하는 한 쌍의 정수로 구성됩니다.

fractions.Fraction 클래스를 사용하면 Fraction 객체를 만들 수 있습니다. 이 클래스는 분자와 분모를 인자로 받으며, 기본값은 각각 0과 1입니다. 만약 분모에 0을 전달하면 ZeroDivisionError가 발생하니 주의해야 합니다.

먼저 분자와 분모를 직접 지정하여 분수를 생성하는 방법부터 살펴보겠습니다.

분자와 분모로 분수 생성하기

from fractions import Fraction as frac
print(frac(45, 54))
print(frac(12, 47))
print(frac(0, 15))

실행 결과

5/6
12/47
0

frac(45, 54)처럼 약분이 가능한 값을 넣으면 자동으로 기약분수인 5/6으로 변환되는 점이 특징입니다.

실수와 문자열 인자의 차이

Fraction 객체에는 실수(float)도 인자로 전달할 수 있습니다. 다만 부동소수점 값은 컴퓨터 내부에서 근사적으로 표현되기 때문에, 실수를 그대로 넣으면 아주 큰 분자와 분모를 가진 분수로 변환됩니다. 반면 문자열로 전달하면 훨씬 직관적이고 정확한 분수 값을 얻을 수 있습니다.

from fractions import Fraction as frac
print(frac(33.33))
print(frac('33.33'))

실행 결과

2345390243441541/70368744177664
3333/100

위 결과에서 알 수 있듯이, 동일한 값이라도 실수형으로 넘기면 부동소수점 오차가 그대로 반영되지만, 문자열로 넘기면 3333/100처럼 우리가 의도한 정확한 분수가 만들어집니다.

문자열 인자 활용과 부호 지원

문자열 인자는 분수 형태('5/6')뿐만 아니라 소수 형태도 지원하며, 양수와 음수 부호(+/-)도 함께 사용할 수 있습니다.

from fractions import Fraction as frac
print(frac('5/6'))
print(frac('-25.12'))
print(frac('96.251 \t\n'))
print(frac('3.14159265359'))

실행 결과

5/6
-628/25
96251/1000
314159265359/100000000000

문자열 앞뒤에 탭이나 줄바꿈 같은 공백 문자가 포함되어 있어도 정상적으로 처리된다는 점도 눈여겨볼 만합니다.

limit_denominator()로 분모 크기 제한하기

앞선 예제에서 본 것처럼, Fraction 객체의 분모는 때때로 매우 커질 수 있습니다. 이럴 때는 limit_denominator() 메서드를 사용해 분모의 최대 길이를 제한할 수 있습니다. 기본 제한값은 1000000이며, 이 기능은 부동소수점 데이터에 대한 유리수 근사(rational approximation)를 수행할 때 특히 유용합니다.

또한 분수 객체 전체가 아니라 분자나 분모 값만 필요한 경우에는 numerator, denominator 속성을 사용하면 됩니다.

from fractions import Fraction as frac
print(frac('3.14159265359'))
print(frac('3.14159265359').limit_denominator(1000))
print(frac('3.14159265359').limit_denominator(100))
print(frac('3.14159265359').limit_denominator(10))
print(frac('36.25'))
print(frac('36.25').numerator)
print(frac('36.25').denominator)

실행 결과

314159265359/100000000000
355/113
311/99
22/7
145/4
145
4

원주율(π)을 limit_denominator(10)으로 근사하면 잘 알려진 22/7이 나오는 것을 확인할 수 있습니다. 이처럼 제한값을 조절하며 원하는 정밀도의 근사 분수를 손쉽게 구할 수 있습니다.

분수의 산술 연산

Fraction 객체는 덧셈, 뺄셈, 곱셈, 나눗셈, 거듭제곱 등 일반적인 수학 연산을 모두 지원합니다.

from fractions import Fraction as frac
print('Add: ' + str(frac('5/4') + frac('9/8')))
print('Subtract: ' + str(frac('15/20') - frac('2/8')))
print('Multiply: ' + str(frac('2/3') * frac('5/7')))
print('Divide: ' + str(frac('80/125') / frac('12/45')))
print('Power: ' + str(frac('5/6') ** 3))

실행 결과

Add: 19/8
Subtract: 1/2
Multiply: 10/21
Divide: 12/5
Power: 125/216

연산 결과 역시 항상 기약분수 형태로 자동 정리되므로, 부동소수점 오차 없이 정확한 유리수 계산이 가능합니다.

제곱근, 내림, 올림 연산

math 모듈과 함께 사용하면 제곱근, 내림(floor), 올림(ceiling) 같은 추가 연산도 적용할 수 있습니다.

from fractions import Fraction as frac
import math
print('Square Root: ' + str(math.sqrt(frac(36, 64))))
print('Square Root: ' + str(frac(math.sqrt(frac(36, 64)))))
print('Floor Value: ' + str(math.floor(frac('22/7'))))
print('Ceiling Value: ' + str(math.ceil(frac('22/7'))))

실행 결과

Square Root: 0.75
Square Root: 3/4
Floor Value: 3
Ceiling Value: 4

math.sqrt()의 반환값을 다시 Fraction으로 감싸면 0.753/4로 변환되는 것을 볼 수 있습니다. 이렇게 fractions 모듈을 활용하면 정확한 유리수 계산이 필요한 금융, 과학, 통계 분야의 프로그래밍에서 매우 유용하게 사용할 수 있습니다.