fractions.from_number: converta números em frações

Publicado em: 09/10/2026
Tempo de leitura: 5 minutos
Código Python e representação de frações numéricas

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.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Desenvolvedor configurando servidor HTTPS e certificado TLS com Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    HTTPSServer: crie servidor HTTPS local no Python

    Aprenda HTTPSServer no Python para servir HTTPS localmente, configurar certificados, usar threads e entender limites de segurança.

    Ler mais

    Tempo de leitura: 5 minutos
    08/10/2026
    Arquivos protegidos representando extração segura de TAR com Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    tarfile extraction_filter: extraia TAR com segurança

    Aprenda tarfile extraction_filter no Python para extrair arquivos TAR com validação, segurança e controle de caminhos.

    Ler mais

    Tempo de leitura: 6 minutos
    08/10/2026
    Código Python exibindo avisos controlados com catch_warnings
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    catch_warnings: capture warnings em testes Python

    Aprenda catch_warnings no Python para capturar, testar e controlar avisos com filtros específicos e segurança.

    Ler mais

    Tempo de leitura: 5 minutos
    07/10/2026
    Código Python representando referências persistentes do pickle
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    pickle persistent_id: serialize referências externas

    Aprenda pickle persistent_id no Python para serializar referências externas com IDs estáveis, validação, segurança e compatibilidade.

    Ler mais

    Tempo de leitura: 5 minutos
    07/10/2026
    Código binário representando buffers e memória no Python
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    memoryview.count: conte valores sem copiar buffers

    Aprenda memoryview.count no Python para contar bytes e valores em buffers sem cópias, com formatos, limites e boas práticas.

    Ler mais

    Tempo de leitura: 6 minutos
    06/10/2026
    Código Python com anotações de tipos
    Python Avançado
    Foto de perfil de Leandro Hirt da Academify

    annotationlib: evite imports circulares em anotações

    Aprenda annotationlib no Python para ler anotações adiadas, evitar imports circulares e criar ferramentas de introspecção seguras.

    Ler mais

    Tempo de leitura: 6 minutos
    06/10/2026