Fr

Frações em Python

{one: "1 exercício", many: "%{count} de exercícios", other: "%{count} exercícios"}

Sobre Frações

O módulo fractions permite criar e trabalhar com rational numbers: frações com um numerador inteiro dividido por um denominador inteiro.

Por exemplo, podemos armazenar 2/3 como uma fração exata em vez do valor float aproximado 0.6666...

Criando frações

Diferentemente dos números int, float e complex, as frações não têm uma forma literal. No entanto, o construtor de frações é bastante flexível.

O mais óbvio é que ele pode receber dois números inteiros. Fatores comuns são removidos automaticamente, convertendo a fração para sua "forma irredutível" (os menores números inteiros que representam a fração com exatidão):

>>> from fractions import Fraction

>>> f1 = Fraction(2, 3) # 2/3
>>> f1
Fraction(2, 3)

>>> f2 = Fraction(6, 9)
>>> f2
Fraction(2, 3)  # automatically simplified

>>> f1 == f2
True

O construtor de frações também pode interpretar uma representação em string:

>>> f3 = Fraction('2/3')
>>> f3
Fraction(2, 3)

Ele também pode trabalhar com parâmetros float, mas isso pode trazer problemas por causa da natureza aproximada de representar o valor decimal internamente em binário. Para saber mais sobre esse problema de representação, consulte o site 0.30000000000000004 e Aritmética de Ponto Flutuante: Problemas e Limitações na documentação do Python.

Para um resultado mais confiável ao usar números de ponto flutuante com frações, existe o método <fraction>.limit_denominator().

.limit_denominator() pode receber um parâmetro inteiro se você tiver requisitos específicos, mas até o padrão (max_denominator=1000000) pode funcionar bem e dar uma aproximação aceitável e simples.

>>> Fraction(1.2)
Fraction(5404319552844595, 4503599627370496)

>>> Fraction(1.2).limit_denominator()
Fraction(6, 5)

Aritmética com frações

Os arithmetic operators usuais + - * / ** funcionam com frações, assim como com outros tipos numéricos.

Números inteiros e outros Fractions podem ser incluídos e dão um resultado Fraction. Incluir um float na expressão resulta em saída float, com uma consequente (possível) perda de precisão.

>>> Fraction(2, 3) + Fraction(1, 4) # addition
Fraction(11, 12)

>>> Fraction(2, 3) * Fraction(6, 5) # multiply fractions
Fraction(4, 5)

>>> Fraction(2, 3) * 6 / 5 # fraction with integers
Fraction(4, 5)

>>> Fraction(2, 3) * 1.2  # fraction with float -> float
0.7999999999999999

>>> Fraction(2, 3) ** 2  # exponentiation with integer
Fraction(4, 9)

Conversões de e para frações

Frações são ótimas para preservar precisão durante cálculos intermediários, mas podem não ser o que você quer para a saída final.

É possível obter o numerador e o denominador individualmente ou como uma tupla (sobre tuples, falaremos em um conceito posterior):

>>> Fraction(2, 3).numerator
2
>>> Fraction(2, 3).denominator
3
>>> Fraction(2, 3).as_integer_ratio()
(2, 3)

Várias funções numéricas padrão do Python também dão o resultado que você esperaria ao trabalhar com os tipos int e float:

>>> round(Fraction(11, 3))
4

>>> from math import floor, ceil
>>> floor(Fraction(11, 3))
3
>>> ceil(Fraction(11, 3))
4

>>> float(Fraction(11, 3))
3.6666666666666665
Editar via GitHub O link abre em uma nova janela ou aba