A classe Fraction implementa operações numéricas para números racionais com base na API definida pelo Rational em numbers.
Uma simples maneira de criarmos uma instância é através da separação dos valores numerador e denominador
Vejamos exemplos
import fractions
fracoes = [(1, 2), (2, 4), (3,6), (5,7)]
# O menor denominador comum é mantido à medida que novos valores são calculados.
for n, d in fracoes:
f = fractions.Fraction(n, d)
print(f'{n}/{d} = {f}')
1/2 = 1/2 2/4 = 1/2 3/6 = 1/2 5/7 = 5/7
Outra maneira de criar uma Fração é utilizando uma representação de string de <numerador> / <denominador>
frac = ['2/4', '3/3', '5/2', '4/8']
for s in frac:
f = fractions.Fraction(s)
print(f'{s} = {f}')
2/4 = 1/2 3/3 = 1 5/2 = 5/2 4/8 = 1/2
As strings também podem usar a notação decimal ou ponto flutuante mais usual de [<dígitos>].[<Dígitos>]
.
numeros = ['0.5', '1.5', '2.0', '5.2', '3.5']
for s in numeros:
f = fractions.Fraction(s)
print(f'{s} = {f}')
0.5 = 1/2 1.5 = 3/2 2.0 = 2 5.2 = 26/5 3.5 = 7/2
Existem métodos de classe para criar instâncias de Fração diretamente de outras representações de valores racionais, como float ou decimal
numbers = [1.1, 2.2, 0.5, 1.5]
for v in numbers:
print(f'{v} = {fractions.Fraction.from_float(v)}')
1.1 = 2476979795053773/2251799813685248 2.2 = 2476979795053773/1125899906842624 0.5 = 1/2 1.5 = 3/2
Observe que, para valores de ponto flutuante que não podem ser expressos exatamente, a representação racional pode produzir resultados inesperados.
O uso de representações decimais dos valores fornece os resultados esperados:
import decimal
decimais = [decimal.Decimal('0.1'),
decimal.Decimal('0.5'),
decimal.Decimal('1.5'),
decimal.Decimal('2.0'),
decimal.Decimal('2.3'),
decimal.Decimal('5.8'),]
for v in decimais:
print(f'{v} = {fractions.Fraction.from_decimal(v)}')
0.1 = 1/10 0.5 = 1/2 1.5 = 3/2 2.0 = 2 2.3 = 23/10 5.8 = 29/5
Depois que as frações são instanciadas, elas podem ser usadas em expressões matemáticas como esperado.
f1 = fractions.Fraction(1, 2)
f2 = fractions.Fraction(5, 4)
print(f'{f1} + {f2} = {f1 + f2}')
print(f'{f1} + {f2} = {f1 - f2}')
print(f'{f1} + {f2} = {f1 * f2}')
print(f'{f1} + {f2} = {f1 / f2}')
1/2 + 5/4 = 7/4 1/2 + 5/4 = -3/4 1/2 + 5/4 = 5/8 1/2 + 5/4 = 2/5
Um recurso útil do Fraction é a capacidade de converter um número de ponto flutuante em um valor racional aproximado, limitando o tamanho do denominador.
import math
f_pi = fractions.Fraction(str(math.pi))
print(f'PI: {math.pi}')
print(f'Sem Limite: {f_pi}' )
PI: 3.141592653589793 Sem Limite: 3141592653589793/1000000000000000
for i in range(1, 100, 5):
limited = f_pi.limit_denominator(i)
print(f'{i} = {limited}')
1 = 3 6 = 19/6 11 = 22/7 16 = 22/7 21 = 22/7 26 = 22/7 31 = 22/7 36 = 22/7 41 = 22/7 46 = 22/7 51 = 22/7 56 = 22/7 61 = 179/57 66 = 201/64 71 = 223/71 76 = 223/71 81 = 245/78 86 = 267/85 91 = 267/85 96 = 289/92