Problema de imprecisão dos números de ponto flutuante

Os números de ponto flutuante em Python, e em muitas outras linguagens de programação, são representados internamente como aproximações binárias de valores decimais.

Devido a essa representação binária, alguns números decimais não podem ser exatamente representados com precisão. Isso pode levar a resultados inesperados em cálculos envolvendo números de ponto flutuante.

Para mais informações: double-precision floating-point format.

Problema de Precisão

Por exemplo, a representação interna de 0.1 em binário não é exata, o que pode resultar em imprecisões quando operações matemáticas são realizadas:

resultado = 0.1 + 0.1 + 0.1 - 0.3
print(resultado)  # Resultado esperado: 0.0, mas devido à imprecisão: 5.551115123125783e-17

Uso da função round

A função embutida round() pode ajudar a mitigar esse problema, arredondando números de ponto flutuante para um número específico de casas decimais:

resultado = round(0.1 + 0.1 + 0.1 - 0.3, 2)
print(resultado)  # 0.0

Módulo decimal

Quando uma alta precisão é necessária, a biblioteca decimal pode ser usada. Ela oferece aritmética decimal de ponto fixo para evitar as imprecisões inerentes aos números de ponto flutuante. Para utilizar essa biblioteca, é necessário criar objetos Decimal e usar as funções e operadores fornecidos por ela:

from decimal import Decimal
 
num1 = Decimal("0.1")
num2 = Decimal("0.7")
 
resultado = num1 + num2
print(resultado)  # 0.8

Conclusão

A imprecisão dos números de ponto flutuante é uma característica comum em muitas linguagens de programação. É importante estar ciente dessa imprecisão e usar abordagens apropriadas, como a função round() ou a biblioteca decimal, dependendo da necessidade de precisão nos cálculos.