O método fractions.Fraction.from_number() facilita a criação de frações exatas a partir de valores numéricos compatíveis. Ele é útil quando você precisa preservar a relação entre numerador e denominador, evitar perdas causadas por arredondamentos prematuros e tornar explícita a conversão de diferentes tipos numéricos para Fraction.
O que é Fraction no Python
A classe Fraction, do módulo fractions, representa números racionais na forma numerador sobre denominador. Diferentemente de um float, que usa representação binária de ponto flutuante, uma fração mantém uma razão exata entre dois inteiros. Isso é especialmente útil em cálculos financeiros controlados, algoritmos matemáticos, conversões de medidas, probabilidades e testes que exigem resultados previsíveis.
Você pode conhecer mais conceitos de tipos numéricos em nosso conteúdo sobre tipos de dados no Python, revisar operações em operadores Python e aprofundar a estrutura da linguagem em nosso curso de Python.
Como usar from_number
O uso básico começa com a importação da classe. Em seguida, basta chamar o construtor alternativo com um número compatível:
from fractions import Fraction
valor = Fraction.from_number(5)
print(valor) # 5
Com um inteiro, o denominador é um. Com outro objeto racional, a fração correspondente é preservada. O principal benefício é expressar claramente que a origem do valor é numérica, em vez de uma string textual.
Conversão de float
Ao converter um float, é importante lembrar que o valor já foi armazenado em formato binário. Portanto, a fração gerada representa exatamente aquele número binário, e não necessariamente a forma decimal digitada pelo programador.
from fractions import Fraction
f = Fraction.from_number(0.1)
print(f)
print(f.limit_denominator())
O primeiro resultado pode ter um numerador e denominador grandes. Isso não é um erro: é a representação exata do float. Quando você deseja uma aproximação humana mais simples, limit_denominator() pode reduzir a fração para um denominador aceitável.
Para entender por que isso acontece, vale revisar a documentação oficial sobre aritmética de ponto flutuante e a referência do módulo fractions.
Decimal e precisão
Valores de Decimal são úteis quando a entrada decimal precisa ser preservada de forma mais previsível. Como Decimal('0.1') representa exatamente um décimo, sua conversão pode produzir a fração 1/10.
from decimal import Decimal
from fractions import Fraction
valor = Decimal('0.125')
fracao = Fraction.from_number(valor)
print(fracao) # 1/8
Isso é preferível a criar primeiro um float quando a origem do dado é decimal, como preços, taxas ou proporções fornecidas em texto. Leia também nosso guia sobre Decimal no Python para compreender arredondamento e contexto de precisão.
Diferença entre número e string
from_number() foi criado para objetos numéricos. Para strings como '3/7' ou '0.25', o construtor tradicional Fraction() continua sendo a opção adequada.
from fractions import Fraction
texto = Fraction('3/7')
numero = Fraction.from_number(0.25)
Separar esses dois caminhos melhora a clareza da API. Um valor textual precisa ser interpretado; um valor numérico precisa ser convertido segundo seu protocolo numérico.
Uso com tipos personalizados
Em projetos avançados, você pode trabalhar com tipos que implementam protocolos numéricos compatíveis. Antes de converter, valide explicitamente o tipo aceito e trate erros com cuidado. Isso evita que dados inválidos sejam silenciosamente interpretados.
from fractions import Fraction
def como_fracao(valor):
try:
return Fraction.from_number(valor)
except (TypeError, ValueError) as erro:
raise ValueError(f'Valor numérico inválido: {valor!r}') from erro
Esse padrão é útil em APIs, pipelines de dados e bibliotecas internas. Para reforçar a qualidade do código, veja nosso material sobre tratamento de erros no Python.
Frações em cálculos reais
Uma vez criada, a fração participa normalmente de operações aritméticas:
from fractions import Fraction
a = Fraction.from_number(3)
b = Fraction(1, 4)
print(a + b)
print(a * b)
print(a / b)
Os resultados permanecem racionais enquanto possível. Isso ajuda em algoritmos que trabalham com escalas musicais, taxas, proporções geométricas, divisão de recursos e cálculos combinatórios.
Quando evitar Fraction
Frações exatas não são sempre a melhor escolha. Para grandes volumes de dados científicos, arrays numéricos e modelos de aprendizado de máquina, float e bibliotecas vetorizadas normalmente oferecem desempenho muito superior. Em sistemas financeiros, Decimal pode ser mais natural por trabalhar diretamente com casas decimais e regras de arredondamento.
Use Fraction quando a exatidão racional e a transparência do denominador forem mais importantes que velocidade. Evite conversões desnecessárias em loops críticos e meça o desempenho antes de adotar o tipo em larga escala.
Boas práticas
Escolha a origem correta do valor. Use inteiros e Decimal quando quiser preservar uma razão simples. Ao converter float, documente que a fração refletirá o valor binário armazenado. Aplique limit_denominator() apenas quando uma aproximação for aceitável e defina um limite coerente com o domínio do problema.
Também é importante validar entradas externas, testar casos como zero, números negativos e valores muito grandes, e evitar assumir que uma representação decimal digitada será recuperada exatamente após passar por float.
Conclusão
Fraction.from_number() torna explícita a conversão de objetos numéricos para frações no Python. Ele ajuda a diferenciar números de strings, preserva valores racionais quando possível e oferece uma base segura para cálculos exatos. Ao combinar esse método com Decimal, limit_denominator(), validação de tipos e testes, você consegue escolher conscientemente entre exatidão, legibilidade e desempenho.







