Класс fractions.Fraction
наследуется от абстрактного базового класса numbers.Rational
и реализует все методы и операции этого класса. Кроме того, Fraction()
обладает своими свойствами и методами:
Fraction.numerator
,Fraction.denominator
,Fraction.from_float()
,Fraction.from_decimal()
,Fraction.limit_denominator()
,Fraction.__floor__()
,Fraction.__ceil__()
,Fraction.__round__()
.Fraction.numerator
:Свойство Fraction.numerator
возвращает числитель дроби.
>>> from fractions import Fraction >>> x = Fraction(3, 8) >>> x.numerator # 3
Fraction.denominator
:Свойство Fraction.denominator
возвращает знаменатель дроби.
>>> from fractions import Fraction >>> x = Fraction(3, 8) >>> x.denominator # 8
Fraction.from_float(flt)
:Метод Fraction.from_float()
принимает число flt
[типа float
] и возвращает дробь, отношение числителя к знаменателю которой максимально приближается к значению flt
.
>>> from fractions import Fraction >>> Fraction.from_float(0.5) # Fraction(1, 2) >>> Fraction.from_float(1.1) # Fraction(2476979795053773, 2251799813685248)
Как можно заметить, из-за проблем хранения чисел с плавающей точкой в двоичном представлении Fraction.from_float(1.1) вовсе не равно Fraction(11, 10)
.
Fraction.from_decimal(dec)
:Метод Fraction.from_decimal()
создает дробь, которая является точным представлением десятичной дроби указанной в dec
, где dec
- это экземпляр класса decimal.Decimal
.
>>> from fractions import Fraction >>> from decimal import Decimal >>> Fraction.from_decimal(Decimal('0.1')) # Fraction(1, 10) >>> Fraction.from_decimal(Decimal('0.11')) # Fraction(11, 100) >>> Fraction.from_decimal(Decimal('0.125')) # Fraction(1, 8)
Fraction.limit_denominator(max_denominator=1000000)
:Метод Fraction.limit_denominator()
возвращает ближайшее рациональное представление указанного числа, знаменатель которого не превышает значение max_denominator
.
>>> from fractions import Fraction >>> Fraction(1.1) # Fraction(2476979795053773, 2251799813685248) >>> Fraction(1.1).limit_denominator(10) # Fraction(11, 10) >>> Fraction(3.1415926).limit_denominator(1000) # Fraction(355, 113)
Данный метод позволяет получать рациональные приближения и восстанавливать рациональные значения по их неточному представлению в виде чисел с плавающей точкой.
>>> from fractions import Fraction >>> 2**(1/3) # 1.2599210498948732 >>> Fraction(2**(1/3)).limit_denominator() # Fraction(1054215, 836731) >>> 1054215/836731 # 1.2599210498953666 >>> from math import * >>> Fraction(cos(pi/3)) # Fraction(4503599627370497, 9007199254740992) >>> Fraction(cos(pi/3)).limit_denominator() # Fraction(1, 2)
Fraction.__floor__()
:Метод Fraction.__floor__()
возвращает значение типа int
, которое является наибольшим среди всех int <= self
. Этот метод также доступен через функцию math.floor()
.
>>> from fractions import Fraction >>> from math import * >>> Fraction(234, 47).__floor__() # 4 >>> floor(Fraction(234, 47)) # 4
Fraction.__ceil__()
:Метод Fraction.__ceil__()
возвращает значение типа int
, которое является наименьшим среди всех int >= self
. Этот метод также доступен через функцию math.ceil()
.
>>> from fractions import Fraction >>> from math import * >>> Fraction(234, 47).__ceil__() # 5 >>> ceil(Fraction(234, 47)) # 5
Fraction.__round__(ndigits=None)
:Метод Fraction.__round__()
округляет до ближайшего четного числа. Этот метод также доступен через встроенную функцию round()
.
Если ndigits=None
, то округление выполняется до ближайшего четного целого числа:
>>> from fractions import Fraction >>> Fraction('1/2').__round__() # 0 >>> Fraction('3/2').__round__() # 2
Если ndigits
не равно None
, то округление выполняется до ближайшего числа кратного Fraction(1, 10**ndigits)
, при этом если последняя цифра 5, то округление будет выполнено к ближайшей четной цифре:
>>> from fractions import Fraction >>> Fraction('7/3').__round__(1) # Fraction(23, 10) >>> Fraction('7/3').__round__(2) # Fraction(233, 100)
Если ndigits
меньше 0, то округление выполняется до разряда на который указывает abs(ndigits)
, при этом если последняя цифра 5, то округление будет выполнено к ближайшей четной цифре.
>>> from fractions import Fraction >>> Fraction('357/3').__round__(-1) # Fraction(120, 1) >>> Fraction('357/3').__round__(-2) # Fraction(100, 1) >>> Fraction('357/5').__round__(-2) # Fraction(100, 1) >>> Fraction('357/5').__round__(-1) # Fraction(70, 1)