fractions — 유리수
fractions — 유리수
fractions 모듈은 유리수 산술을 지원해요.
Fraction 인스턴스는 유리수 쌍, 단일 숫자, 또는 문자열로부터 만들 수 있어요.
출처: Python 표준 라이브러리
본문
class fractions.Fraction(numerator=0, denominator=1)
class fractions.Fraction(number)
class fractions.Fraction(string)
첫 번째 형태는 numerator와 denominator가 numbers.Rational 인스턴스여야 하고, numerator/denominator와 같은 값을 가진 새 Fraction 인스턴스를 돌려줘요. denominator가 0이면 ZeroDivisionError를 발생시켜요.
두 번째 형태는 number가 numbers.Rational 인스턴스이거나 as_integer_ratio() 메서드를 가져야 해요(float와 decimal.Decimal 포함). 정확히 같은 값을 가진 Fraction 인스턴스를 돌려줘요. as_integer_ratio() 메서드가 서로 소인 정수 쌍(마지막은 양수)을 돌려준다고 가정해요. 이진 소수점의 일반적인 문제 때문에(부동소수점 산술: 문제와 한계 참고) Fraction(1.1)의 인자는 정확히 11/10이 아니므로, Fraction(1.1)은 기대할 수도 있는 Fraction(11, 10)을 돌려주지 않아요. (단, 아래 limit_denominator() 메서드 문서를 보세요.)
마지막 형태의 생성자는 문자열을 기대해요. 이 인스턴스의 일반적인 형태는 다음과 같아요.
[sign] numerator ['/' denominator]
여기서 선택적 sign은 '+' 또는 '-'이고, numerator와 denominator(있으면)는 10진 숫자 문자열이에요(코드의 정수 리터럴처럼 밑줄로 자릿수를 구분할 수 있어요). 또한 float 생성자가 받아들이는 유한 값을 나타내는 문자열은 모두 Fraction 생성자도 받아들여요. 두 형태 모두 입력 문자열에 앞뒤 공백이 있을 수 있어요. 몇 가지 예시를 볼게요.
>>> from fractions import Fraction
>>> Fraction(16, -10)
Fraction(-8, 5)
>>> Fraction(123)
Fraction(123, 1)
>>> Fraction()
Fraction(0, 1)
>>> Fraction('3/7')
Fraction(3, 7)
>>> Fraction(' -3/7 ')
Fraction(-3, 7)
>>> Fraction('1.414213 \t\n')
Fraction(1414213, 1000000)
>>> Fraction('-.125')
Fraction(-1, 8)
>>> Fraction('7e-6')
Fraction(7, 1000000)
>>> Fraction(2.25)
Fraction(9, 4)
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> from decimal import Decimal
>>> Fraction(Decimal('1.1'))
Fraction(11, 10)
Fraction 클래스는 추상 기본 클래스 numbers.Rational을 상속하며, 그 클래스의 모든 메서드와 연산을 구현해요. Fraction 인스턴스는 해시 가능하고 불변으로 취급해야 해요. 게다가 Fraction은 다음 속성·메서드들을 가져요.
버전 3.2에서 변경: Fraction 생성자가 이제 float와 decimal.Decimal 인스턴스를 받아들임.
버전 3.9에서 변경: 분자·분모를 정규화하는 데 math.gcd()가 사용됨. math.gcd()는 항상 int 타입을 돌려줌. 이전에는 GCD 타입이 분자·분모에 따라 달랐음.
버전 3.11에서 변경: PEP 515 규칙에 따라 문자열에서 Fraction 인스턴스를 만들 때 밑줄이 허용됨.
버전 3.11에서 변경: Fraction이 typing.SupportsInt 인스턴스 검사를 충족하도록 __int__를 구현함.
버전 3.12에서 변경: 문자열 입력에서 슬래시 주변 공백이 허용됨: Fraction('2 / 3').
버전 3.12에서 변경: Fraction 인스턴스가 이제 "e", "E", "f", "F", "g", "G", "%" 프레젠테이션 타입으로 float 스타일 포맷을 지원함.
버전 3.13에서 변경: 프레젠테이션 타입 없이 Fraction 인스턴스 포맷이 fill, 정렬, 부호 처리, 최소 너비, 그룹화를 지원함.
버전 3.14에서 변경: Fraction 생성자가 이제 as_integer_ratio() 메서드를 가진 모든 객체를 받아들임.
numerator
최저 항으로 기약한 Fraction의 분자.
denominator
최저 항으로 기약한 Fraction의 분모. 양수임이 보장돼요.
as_integer_ratio()
비율이 원래 Fraction과 같은 두 정수의 튜플을 돌려줘요. 비율은 최저 항이고 분모는 양수예요.
버전 3.8에 추가됨.
is_integer()
Fraction이 정수이면 True를 돌려줘요.
버전 3.12에 추가됨.
classmethod from_float(f)
float 또는 numbers.Integral 인스턴스만 받는 대체 생성자예요. Fraction.from_float(0.3)은 Fraction(3, 10)과 같은 값이 아니라는 점에 주의하세요.
참고 — Python 3.2부터는
float에서 직접Fraction인스턴스를 만들 수도 있어요.
classmethod from_decimal(dec)
decimal.Decimal 또는 numbers.Integral 인스턴스만 받는 대체 생성자예요.
참고 — Python 3.2부터는
decimal.Decimal인스턴스에서 직접Fraction인스턴스를 만들 수도 있어요.
classmethod from_number(number)
numbers.Integral, numbers.Rational, float, decimal.Decimal, 그리고 as_integer_ratio() 메서드를 가진 객체는 받지만 문자열은 받지 않는 대체 생성자예요.
버전 3.14에 추가됨.
limit_denominator(max_denominator=1000000)
self에 가장 가까운, 분모가 최대 max_denominator인 Fraction을 찾아서 돌려줘요. 이 메서드는 주어진 부동소수점 숫자에 대한 유리수 근사를 찾는 데 유용해요.
>>> from fractions import Fraction
>>> Fraction('3.1415926535897932').limit_denominator(1000)
Fraction(355, 113)
또는 float로 표현된 유리수를 복구하는 데도 유용해요.
>>> from math import pi, cos
>>> Fraction(cos(pi/3))
Fraction(4503599627370497, 9007199254740992)
>>> Fraction(cos(pi/3)).limit_denominator()
Fraction(1, 2)
>>> Fraction(1.1).limit_denominator()
Fraction(11, 10)
floor()
self보다 작거나 같은 가장 큰 int를 돌려줘요. 이 메서드는 math.floor() 함수로도 접근할 수 있어요.
>>> from math import floor
>>> floor(Fraction(355, 113))
3
ceil()
self보다 크거나 같은 가장 작은 int를 돌려줘요. 이 메서드는 math.ceil() 함수로도 접근할 수 있어요.
round()
round(ndigits)
첫 번째 형태는 self에 가장 가까운 int를 돌려주는데, 반올림은 half to even이에요. 두 번째 형태는 self를 Fraction(1, 10**ndigits)의 가장 가까운 배수로 반올림해요(논리적으로 ndigits가 음수일 때), 역시 half to even으로 반올림해요. 이 메서드는 round() 함수로도 접근할 수 있어요.
format(format_spec, /)
str.format() 메서드, format() 내장 함수, 또는 f-string을 통한 Fraction 인스턴스 포맷을 지원해요.
format_spec 형식 지정 문자열이 프레젠테이션 타입 'e', 'E', 'f', 'F', 'g', 'G', '%' 중 하나로 끝나지 않으면, 포맷 지정 미니 언어에 설명된 fill, 정렬, 부호 처리, 최소 너비, 그룹화의 일반 규칙을 따라 포맷해요. "대체 형식" 플래그 '#'이 지원돼요: 있으면 포맷되는 값이 정확히 정수여도 출력 문자열이 항상 명시적 분모를 포함하도록 강제해요. 0-채우기 플래그 '0'은 지원되지 않아요.
format_spec 형식 지정 문자열이 프레젠테이션 타입 'e', 'E', 'f', 'F', 'g', 'G', '%' 중 하나로 끝나면, 포맷 지정 미니 언어 절에서 float 타입에 대해 설명한 규칙을 따라 포맷해요.
몇 가지 예시를 볼게요.
>>> from fractions import Fraction
>>> format(Fraction(103993, 33102), '_')
'103_993/33_102'
>>> format(Fraction(1, 7), '.^+10')
'...+1/7...'
>>> format(Fraction(3, 1), '')
'3'
>>> format(Fraction(3, 1), '#')
'3/1'
>>> format(Fraction(1, 7), '.40g')
'0.1428571428571428571428571428571428571429'
>>> format(Fraction('1234567.855'), '_.2f')
'1_234_567.86'
>>> f"{Fraction(355, 113):*>20.6e}"
'********3.141593e+00'
>>> old_price, new_price = 499, 672
>>> "{:.2%} price increase".format(Fraction(new_price, old_price) - 1)
'34.67% price increase'
더 알아보기
numbers— 숫자 타워를 구성하는 추상 기본 클래스들.