Cómo comprobar si un número de punto flotante no tiene parte decimal en Python

PythonPythonBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio (lab), aprenderás cómo verificar si un número de punto flotante (float) no tiene parte decimal en Python, abordando los desafíos planteados por la representación de números de punto flotante. El laboratorio comienza explorando la imprecisión inherente de los números de punto flotante y su impacto en las comparaciones directas. Crearás un script de Python para observar cómo cálculos aparentemente simples como 0.1 + 0.2 pueden dar como resultado valores ligeramente diferentes a los esperados, lo que conduce a resultados inesperados en las comparaciones.

A continuación, el laboratorio te guiará a través de dos métodos para determinar si un número de punto flotante representa efectivamente un entero: utilizando el método is_integer() y comparando el número de punto flotante con su conversión a entero. Estas técnicas proporcionan soluciones prácticas para identificar con precisión los números de punto flotante sin componente decimal, a pesar de las limitaciones de representación subyacentes.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/ControlFlowGroup(["Control Flow"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python/BasicConceptsGroup -.-> python/numeric_types("Numeric Types") python/BasicConceptsGroup -.-> python/type_conversion("Type Conversion") python/ControlFlowGroup -.-> python/conditional_statements("Conditional Statements") python/FunctionsGroup -.-> python/build_in_functions("Build-in Functions") subgraph Lab Skills python/numeric_types -.-> lab-559515{{"Cómo comprobar si un número de punto flotante no tiene parte decimal en Python"}} python/type_conversion -.-> lab-559515{{"Cómo comprobar si un número de punto flotante no tiene parte decimal en Python"}} python/conditional_statements -.-> lab-559515{{"Cómo comprobar si un número de punto flotante no tiene parte decimal en Python"}} python/build_in_functions -.-> lab-559515{{"Cómo comprobar si un número de punto flotante no tiene parte decimal en Python"}} end

Explorar la Representación de Números de Punto Flotante

En este paso, explorarás cómo se representan los números de punto flotante (floating-point numbers) en Python y las posibles implicaciones que esta representación puede tener en las comparaciones numéricas. Los números de punto flotante se utilizan para representar números reales (números con puntos decimales) en las computadoras. Sin embargo, debido a la forma en que se almacenan en la memoria, a menudo son aproximaciones de los números reales reales. Esto puede llevar a resultados inesperados al realizar comparaciones.

Comencemos creando un archivo de Python llamado float_representation.py en tu directorio ~/project utilizando el editor VS Code.

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

## Print the value of x
print(x)

Guarda el archivo y luego ejecútalo utilizando el siguiente comando en la terminal:

python float_representation.py

Podrías esperar que la salida sea 0.3, pero probablemente verás algo como esto:

0.30000000000000004

Esto se debe a que 0.1 y 0.2 no se pueden representar exactamente como números de punto flotante. El resultado de la suma es un número que está muy cerca de 0.3, pero no es exactamente igual a él.

Ahora, veamos cómo esta imprecisión puede afectar las comparaciones. Agrega el siguiente código a tu archivo 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")

Guarda el archivo y ejecútalo nuevamente:

python float_representation.py

Probablemente verás la siguiente salida:

x is not equal to 0.3

Esto se debe a que x no es exactamente igual a 0.3 debido al problema de representación de números de punto flotante.

Para comparar números de punto flotante con precisión, debes utilizar un valor de tolerancia. En lugar de verificar la igualdad exacta, verifica si la diferencia absoluta entre los dos números es menor que un pequeño valor de tolerancia.

Modifica tu archivo float_representation.py para incluir una tolerancia:

## 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")

Guarda el archivo y ejecútalo una vez más:

python float_representation.py

Ahora, deberías ver la siguiente salida:

x is approximately equal to 0.3

Al utilizar una tolerancia, puedes comparar con precisión los números de punto flotante a pesar de la imprecisión inherente en su representación. Este es un concepto crucial para entender cuando se trabaja con números de punto flotante en Python y otros lenguajes de programación.

Usar el Método is_integer()

En este paso, aprenderás cómo usar el método is_integer() para verificar si un número de punto flotante (floating-point number) representa un valor entero. El método is_integer() es un método incorporado para objetos de tipo float en Python que devuelve True si el número de punto flotante tiene un valor entero (es decir, la parte decimal es cero) y False en caso contrario.

Creemos un nuevo archivo de Python llamado is_integer_example.py en tu directorio ~/project utilizando el 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())

Guarda el archivo y ejecútalo utilizando el siguiente comando en la terminal:

python is_integer_example.py

Deberías ver la siguiente salida:

True
False
True

Como puedes ver, is_integer() devuelve True para 5.0 y -2.0 porque representan valores enteros, y False para 3.14 porque tiene una parte decimal.

Ahora, consideremos el problema de representación de números de punto flotante que discutimos en el paso anterior. A veces, un número que debería ser un entero puede no representarse exactamente debido a la imprecisión de los números de punto flotante.

Modifica tu archivo is_integer_example.py para incluir el siguiente código:

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

Guarda el archivo y ejecútalo nuevamente:

python is_integer_example.py

Probablemente verás la siguiente salida:

0.30000000000000004
False

Aunque matemáticamente 0.1 + 0.2 es igual a 0.3, la representación de punto flotante lo hace ligeramente diferente, por lo que is_integer() devuelve False.

Para manejar casos como este, puedes combinar is_integer() con una comprobación de tolerancia, como aprendimos en el paso anterior. Sin embargo, en este caso, estamos comprobando si un número representa un entero, no si es igual a un valor específico.

En resumen, el método is_integer() es una herramienta útil para determinar si un número de punto flotante representa un valor entero. Sin embargo, ten en cuenta el posible impacto de la imprecisión de los números de punto flotante y considera sus implicaciones al usar este método.

Comparar con la Conversión a int()

En este paso, explorarás otra forma de verificar si un número de punto flotante (floating-point number) representa un valor entero: comparándolo con su conversión a entero utilizando la función int(). La función int() trunca la parte decimal de un número de punto flotante, convirtiéndolo efectivamente en el entero más cercano hacia cero.

Creemos un nuevo archivo de Python llamado int_conversion.py en tu directorio ~/project utilizando el 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")

Guarda el archivo y ejecútalo utilizando el siguiente comando en la terminal:

python int_conversion.py

Deberías ver la siguiente salida:

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

Este enfoque funciona porque si un número de punto flotante ya representa un entero, convertirlo a entero utilizando int() no cambiará su valor. Si el número de punto flotante tiene una parte decimal, la función int() la truncará, lo que resultará en un valor diferente.

Ahora, consideremos nuevamente el problema de representación de números de punto flotante. Modifica tu archivo int_conversion.py para incluir el siguiente 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")

Guarda el archivo y ejecútalo nuevamente:

python int_conversion.py

Probablemente verás la siguiente salida:

0.30000000000000004
a is not an integer

Como en el paso anterior, la imprecisión de los números de punto flotante hace que a sea ligeramente diferente de 0.3, y por lo tanto no sea igual a su conversión a entero (que sería 0).

Es importante tener en cuenta que utilizar la conversión int() para verificar la representación entera puede ser menos precisa que utilizar is_integer(). is_integer() verifica si el número de punto flotante representa un valor entero, mientras que comparar con int() verifica si el número de punto flotante es igual a su truncamiento entero.

En resumen, comparar un número de punto flotante con su conversión a entero utilizando int() es otra forma de verificar si representa un valor entero. Sin embargo, ten en cuenta el posible impacto de la imprecisión de los números de punto flotante y considera utilizar is_integer() para obtener resultados más precisos.

Resumen

En este laboratorio (lab), exploraste las complejidades de la representación de números de punto flotante (floating-point) en Python y su impacto en las comparaciones numéricas. Aprendiste que los números de punto flotante a menudo son aproximaciones de números reales debido a su almacenamiento en memoria, lo que puede llevar a posibles imprecisiones al realizar comprobaciones de igualdad directas.

Observaste que sumar 0.1 y 0.2 puede no resultar exactamente en 0.3 y que la comparación directa utilizando == puede dar resultados inesperados. El laboratorio destacó la importancia de entender estas limitaciones y la necesidad de métodos de comparación alternativos, como el uso de valores de tolerancia, para evaluar con precisión la igualdad de números de punto flotante.