p/q 형태의 몫 또는 분수로 표현할 수 있는 수를 유리수(rational number)라고 합니다. 파이썬 표준 라이브러리의 fractions 모듈은 이러한 유리수 연산을 위한 기능을 제공합니다.
Fraction 클래스란?
fractions 모듈은 Fraction 클래스를 정의하며, 이 클래스의 객체는 다음과 같이 다양한 방식으로 생성할 수 있습니다.
Fraction(num, denom)
기본 생성자는 분자(numerator)와 분모(denominator) 두 개의 매개변수를 받습니다. 분자의 기본값은 0, 분모의 기본값은 1입니다. 분모에 0을 지정하면 ZeroDivisionError가 발생합니다.
>>> from fractions import Fraction >>> n1 = Fraction(2,5) >>> n1 Fraction(2, 5) >>> n2 = Fraction(6,15) >>> n2 Fraction(2, 5) >>> n3 = Fraction(10,1) >>> n3 Fraction(10, 1) >>> n3 = Fraction(10) >>> n3 Fraction(10, 1)
위 예시에서 볼 수 있듯이, 분자와 분모는 최대공약수로 나누어 항상 기약분수 형태로 자동 약분됩니다. 예를 들어 Fraction(6,15)는 Fraction(2, 5)로 저장됩니다.
문자열로 Fraction 객체 만들기
생성자는 유효한 숫자 표현을 담고 있는 문자열도 매개변수로 받을 수 있습니다.
>>> n1 = Fraction('5')
>>> n1
Fraction(5, 1)
>>> n2 = Fraction('4/7')
>>> n2
Fraction(4, 7)
>>> n3 = Fraction('0.25')
>>> n3
Fraction(1, 4)
>>> n4 = Fraction('1.23E4')
>>> n4
Fraction(12300, 1)float과 Decimal 객체 사용 시 주의점
부동소수점(float) 숫자 역시 생성자의 인자로 사용할 수 있습니다. 하지만 float은 내부적으로 순수한 이진 형태로 표현되기 때문에, 그 결과로 만들어진 Fraction 객체의 분자와 분모 값이 실제 값과 정확히 일치하지 않을 수 있습니다.
반면 decimal.Decimal 객체를 인자로 전달하면 정확한 값을 갖는 Fraction 객체를 얻을 수 있습니다.
>>> from fractions import Fraction
>>> from decimal import Decimal
>>> n1 = Fraction(2.1)
>>> n1
Fraction(4728779608739021, 2251799813685248)
>>> n2 = Fraction(Decimal('2.1'))
>>> n2
Fraction(21, 10)위 예시에서 같은 2.1이라도 float으로 생성하면 엉뚱하게 큰 분수가 되지만, Decimal을 사용하면 깔끔하게 Fraction(21, 10)이 됩니다. 따라서 정확한 소수 값을 다룰 때는 Decimal 변환을 권장합니다.
Fraction 객체의 산술 연산
Fraction 객체에는 사칙연산을 비롯한 모든 산술 연산을 적용할 수 있으며, 결과 역시 Fraction 객체로 반환됩니다.
>>> n1 = Fraction(2,3) >>> n2 = Fraction(1,2) >>> n1+n2 Fraction(7, 6) >>> n1-n2 Fraction(1, 6) >>> n1*n2 Fraction(1, 3) >>> n1/n2 Fraction(4, 3)
참고로 유리수의 사칙연산은 다음과 같은 분수 형태의 계산 규칙에 따라 수행됩니다.

분자와 분모 속성 접근하기
Fraction 객체는 numerator(분자)와 denominator(분모)라는 두 개의 속성을 가지며, 각각 독립적으로 조회할 수 있습니다.
>>> n1 = Fraction(2,3) >>> n1.numerator 2 >>> n1.denominator 3
floor, ceil 및 근사 분수 구하기
Fraction 클래스는 몫보다 작은 최대 정수(내림 값, floor)와 몫보다 큰 최소 정수(올림 값, ceil)를 구하는 데 유용한 메서드를 제공합니다.
>>> n1 = Fraction(355,113) >>> n1.__floor__() 3 >>> n1.__ceil__() 4
또한 클래스 메서드인 limit_denominator()를 사용하면, 분모가 지정한 값 이하인 분수 중에서 원래 값에 가장 가까운 근사 분수를 얻을 수 있습니다. 원주율처럼 무한소수를 적절한 분수로 근사할 때 특히 유용합니다.
>>> Fraction('2.71828').limit_denominator(400)
Fraction(1071, 394)마무리
지금까지 파이썬 표준 라이브러리의 fractions 모듈이 제공하는 주요 기능과 활용법을 살펴보았습니다. Fraction 클래스를 활용하면 부동소수점 오차 없이 정확한 분수 연산이 필요한 금융 계산, 수학 문제 풀이 등에서 매우 유용하게 사용할 수 있습니다.