Como Verificar se um Float Não Tem Parte Decimal em Python

PythonBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como verificar se um número de ponto flutuante (float) não possui parte decimal em Python, abordando os desafios colocados pela representação de ponto flutuante. O laboratório começa explorando a imprecisão inerente dos números de ponto flutuante e seu impacto em comparações diretas. Você criará um script Python para observar como cálculos aparentemente simples como 0.1 + 0.2 podem resultar em valores ligeiramente diferentes do esperado, levando a resultados de comparação inesperados.

O laboratório então o guia por dois métodos para determinar se um float efetivamente representa um inteiro: usando o método is_integer() e comparando o float à sua conversão para inteiro. Essas técnicas fornecem soluções práticas para identificar com precisão floats sem um componente decimal, apesar das limitações da representação subjacente.

Explorar a Representação de Ponto Flutuante

Nesta etapa, você explorará como os números de ponto flutuante (floating-point numbers) são representados em Python e as potenciais implicações que essa representação pode ter em comparações numéricas. Números de ponto flutuante são usados para representar números reais (números com casas decimais) em computadores. No entanto, devido à maneira como são armazenados na memória, eles são frequentemente aproximações dos números reais reais. Isso pode levar a resultados inesperados ao realizar comparações.

Vamos começar criando um arquivo Python chamado float_representation.py em seu diretório ~/project usando o editor VS Code.

## Create a floating-point number
x = 0.1 + 0.2

## Print the value of x
print(x)

Salve o arquivo e, em seguida, execute-o usando o seguinte comando no terminal:

python float_representation.py

Você pode esperar que a saída seja 0.3, mas provavelmente verá algo como isto:

0.30000000000000004

Isso ocorre porque 0.1 e 0.2 não podem ser representados exatamente como números de ponto flutuante. O resultado da adição é um número que está muito próximo de 0.3, mas não exatamente igual a ele.

Agora, vamos ver como essa imprecisão pode afetar as comparações. Adicione o seguinte código ao seu arquivo float_representation.py:

## Create a floating-point number
x = 0.1 + 0.2

## Check if x is equal to 0.3
if x == 0.3:
    print("x is equal to 0.3")
else:
    print("x is not equal to 0.3")

Salve o arquivo e execute-o novamente:

python float_representation.py

Você provavelmente verá a seguinte saída:

x is not equal to 0.3

Isso ocorre porque x não é exatamente igual a 0.3 devido ao problema de representação de ponto flutuante.

Para comparar números de ponto flutuante com precisão, você deve usar um valor de tolerância. Em vez de verificar a igualdade exata, verifique se a diferença absoluta entre os dois números é menor que um pequeno valor de tolerância.

Modifique seu arquivo float_representation.py para incluir uma tolerância:

## Create a floating-point number
x = 0.1 + 0.2

## Define a tolerance value
tolerance = 1e-9  ## A small value like 0.000000001

## Check if x is approximately equal to 0.3
if abs(x - 0.3) < tolerance:
    print("x is approximately equal to 0.3")
else:
    print("x is not approximately equal to 0.3")

Salve o arquivo e execute-o mais uma vez:

python float_representation.py

Agora, você deve ver a seguinte saída:

x is approximately equal to 0.3

Ao usar uma tolerância, você pode comparar com precisão números de ponto flutuante, apesar da imprecisão inerente em sua representação. Este é um conceito crucial para entender ao trabalhar com números de ponto flutuante em Python e outras linguagens de programação.

Usar o Método is_integer()

Nesta etapa, você aprenderá como usar o método is_integer() para verificar se um número de ponto flutuante representa um valor inteiro. O método is_integer() é um método embutido para objetos float em Python que retorna True se o número de ponto flutuante tiver um valor inteiro (ou seja, a parte decimal é zero) e False caso contrário.

Vamos criar um novo arquivo Python chamado is_integer_example.py em seu diretório ~/project usando o editor VS Code.

## Example 1: Integer value
x = 5.0
print(x.is_integer())

## Example 2: Non-integer value
y = 3.14
print(y.is_integer())

## Example 3: Another integer value
z = -2.0
print(z.is_integer())

Salve o arquivo e execute-o usando o seguinte comando no terminal:

python is_integer_example.py

Você deve ver a seguinte saída:

True
False
True

Como você pode ver, is_integer() retorna True para 5.0 e -2.0 porque eles representam valores inteiros, e False para 3.14 porque ele tem uma parte decimal.

Agora, vamos considerar o problema de representação de ponto flutuante que discutimos na etapa anterior. Às vezes, um número que deveria ser um inteiro pode não ser representado exatamente devido à imprecisão de ponto flutuante.

Modifique seu arquivo is_integer_example.py para incluir o seguinte código:

## Example 4: Floating-point imprecision
a = 0.1 + 0.2
print(a)
print(a.is_integer())

Salve o arquivo e execute-o novamente:

python is_integer_example.py

Você provavelmente verá a seguinte saída:

0.30000000000000004
False

Embora 0.1 + 0.2 seja matematicamente igual a 0.3, a representação de ponto flutuante o torna ligeiramente diferente, então is_integer() retorna False.

Para lidar com esses casos, você pode combinar is_integer() com uma verificação de tolerância, como aprendemos na etapa anterior. No entanto, neste caso, estamos verificando se um número representa um inteiro, não se ele é igual a um valor específico.

Em resumo, o método is_integer() é uma ferramenta útil para determinar se um número de ponto flutuante representa um valor inteiro. No entanto, esteja ciente do impacto potencial da imprecisão de ponto flutuante e considere suas implicações ao usar este método.

Comparar com a Conversão int()

Nesta etapa, você explorará outra maneira de verificar se um número de ponto flutuante representa um valor inteiro: comparando-o com sua conversão para inteiro usando a função int(). A função int() trunca a parte decimal de um número de ponto flutuante, efetivamente convertendo-o para o inteiro mais próximo em direção a zero.

Vamos criar um novo arquivo Python chamado int_conversion.py em seu diretório ~/project usando o editor VS Code.

## Example 1: Integer value
x = 5.0
if x == int(x):
    print("x is an integer")
else:
    print("x is not an integer")

## Example 2: Non-integer value
y = 3.14
if y == int(y):
    print("y is an integer")
else:
    print("y is not an integer")

## Example 3: Another integer value
z = -2.0
if z == int(z):
    print("z is an integer")
else:
    print("z is not an integer")

Salve o arquivo e execute-o usando o seguinte comando no terminal:

python int_conversion.py

Você deve ver a seguinte saída:

x is an integer
y is not an integer
z is an integer

Essa abordagem funciona porque, se um número de ponto flutuante já representa um inteiro, convertê-lo para um inteiro usando int() não alterará seu valor. Se o número de ponto flutuante tiver uma parte decimal, a função int() a truncará, resultando em um valor diferente.

Agora, vamos considerar o problema de representação de ponto flutuante novamente. Modifique seu arquivo int_conversion.py para incluir o seguinte código:

## Example 4: Floating-point imprecision
a = 0.1 + 0.2
print(a)
if a == int(a):
    print("a is an integer")
else:
    print("a is not an integer")

Salve o arquivo e execute-o novamente:

python int_conversion.py

Você provavelmente verá a seguinte saída:

0.30000000000000004
a is not an integer

Como na etapa anterior, a imprecisão de ponto flutuante faz com que a seja ligeiramente diferente de 0.3 e, portanto, não seja igual à sua conversão para inteiro (que seria 0).

É importante notar que usar a conversão int() para verificar a representação de inteiros pode ser menos preciso do que usar is_integer(). is_integer() verifica se o número de ponto flutuante representa um valor inteiro, enquanto a comparação com int() verifica se o número de ponto flutuante é igual ao seu truncamento inteiro.

Em resumo, comparar um número de ponto flutuante com sua conversão para inteiro usando int() é outra maneira de verificar se ele representa um valor inteiro. No entanto, esteja ciente do impacto potencial da imprecisão de ponto flutuante e considere usar is_integer() para obter resultados mais precisos.

Resumo

Neste laboratório, você explorou as complexidades da representação de ponto flutuante em Python e seu impacto nas comparações numéricas. Você aprendeu que os números de ponto flutuante são frequentemente aproximações de números reais devido ao seu armazenamento na memória, levando a potenciais imprecisões ao realizar verificações diretas de igualdade.

Você observou que a adição de 0.1 e 0.2 pode não resultar exatamente em 0.3 e que a comparação direta usando == pode produzir resultados inesperados. O laboratório destacou a importância de entender essas limitações e a necessidade de métodos de comparação alternativos, como o uso de valores de tolerância, para avaliar com precisão a igualdade de números de ponto flutuante.