如何在 Python 中检查浮点数是否没有小数部分

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何在 Python 中检查一个浮点数是否没有小数部分,从而应对浮点数表示带来的挑战。实验首先会探讨浮点数固有的不精确性,以及这种不精确性对直接比较的影响。你将创建一个 Python 脚本,观察像 0.1 + 0.2 这样看似简单的计算,如何会得出与预期略有不同的值,进而导致意外的比较结果。

接着,实验将指导你使用两种方法来判断一个浮点数是否实际上表示一个整数:使用 is_integer() 方法,以及将浮点数与其整数转换结果进行比较。尽管存在底层表示的限制,但这些技术为准确识别没有小数部分的浮点数提供了实用的解决方案。


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{{"如何在 Python 中检查浮点数是否没有小数部分"}} python/type_conversion -.-> lab-559515{{"如何在 Python 中检查浮点数是否没有小数部分"}} python/conditional_statements -.-> lab-559515{{"如何在 Python 中检查浮点数是否没有小数部分"}} python/build_in_functions -.-> lab-559515{{"如何在 Python 中检查浮点数是否没有小数部分"}} end

探索浮点数表示

在这一步中,你将探索 Python 中浮点数的表示方式,以及这种表示方式对数值比较可能产生的影响。浮点数用于在计算机中表示实数(带有小数点的数字)。然而,由于它们在内存中的存储方式,它们通常只是实际实数的近似值。这可能会在进行比较时导致意外的结果。

首先,使用 VS Code 编辑器在你的 ~/project 目录下创建一个名为 float_representation.py 的 Python 文件。

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

## Print the value of x
print(x)

保存文件,然后在终端中使用以下命令执行它:

python float_representation.py

你可能期望输出为 0.3,但你可能会看到类似这样的结果:

0.30000000000000004

这是因为 0.10.2 无法精确地表示为浮点数。加法的结果是一个非常接近 0.3 但并不完全相等的数字。

现在,让我们看看这种不精确性如何影响比较。在你的 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")

保存文件并再次运行:

python float_representation.py

你可能会看到以下输出:

x is not equal to 0.3

这是因为由于浮点数表示问题,x 并不完全等于 0.3

为了准确地比较浮点数,你应该使用一个容差值。不要检查是否完全相等,而是检查两个数字之间的绝对差值是否小于一个小的容差值。

修改你的 float_representation.py 文件以包含容差:

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

保存文件并再次运行:

python float_representation.py

现在,你应该会看到以下输出:

x is approximately equal to 0.3

通过使用容差,尽管浮点数表示存在固有的不精确性,你仍然可以准确地比较它们。在 Python 和其他编程语言中处理浮点数时,这是一个需要理解的关键概念。

使用 is_integer() 方法

在这一步中,你将学习如何使用 is_integer() 方法来检查一个浮点数是否表示一个整数值。is_integer() 方法是 Python 中浮点数对象的内置方法,如果浮点数具有整数值(即小数部分为零),则返回 True,否则返回 False

让我们使用 VS Code 编辑器在你的 ~/project 目录下创建一个名为 is_integer_example.py 的新 Python 文件。

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

保存文件,并在终端中使用以下命令执行它:

python is_integer_example.py

你应该会看到以下输出:

True
False
True

如你所见,is_integer()5.0-2.0 返回 True,因为它们表示整数值;对 3.14 返回 False,因为它有小数部分。

现在,让我们考虑上一步中讨论的浮点数表示问题。有时,由于浮点数的不精确性,一个本应是整数的数字可能无法精确表示。

修改你的 is_integer_example.py 文件,添加以下代码:

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

保存文件并再次运行:

python is_integer_example.py

你可能会看到以下输出:

0.30000000000000004
False

尽管 0.1 + 0.2 在数学上等于 0.3,但浮点数表示使其略有不同,因此 is_integer() 返回 False

为了处理这种情况,你可以像上一步所学的那样,将 is_integer() 与容差检查结合使用。不过,在这种情况下,我们是在检查一个数字是否“表示”一个整数,而不是它是否“等于”一个特定的值。

总之,is_integer() 方法是判断一个浮点数是否表示整数值的有用工具。但是,要注意浮点数不精确性可能带来的影响,并在使用此方法时考虑其影响。

int() 转换结果进行比较

在这一步中,你将探索另一种检查浮点数是否表示整数值的方法:将其与使用 int() 函数进行整数转换后的结果进行比较。int() 函数会截断浮点数的小数部分,实际上是将其转换为最接近零的整数。

让我们使用 VS Code 编辑器在你的 ~/project 目录下创建一个名为 int_conversion.py 的新 Python 文件。

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

保存文件,并在终端中使用以下命令执行它:

python int_conversion.py

你应该会看到以下输出:

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

这种方法可行的原因是,如果一个浮点数已经表示一个整数,那么使用 int() 将其转换为整数不会改变其值。如果浮点数有小数部分,int() 函数会截断该部分,从而得到一个不同的值。

现在,让我们再次考虑浮点数表示问题。修改你的 int_conversion.py 文件,添加以下代码:

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

保存文件并再次运行:

python int_conversion.py

你可能会看到以下输出:

0.30000000000000004
a is not an integer

和上一步一样,浮点数的不精确性导致 a0.3 略有不同,因此不等于其整数转换结果(即 0)。

需要注意的是,使用 int() 转换来检查整数表示可能不如使用 is_integer() 精确。is_integer() 检查浮点数是否“表示”一个整数值,而与 int() 转换结果进行比较则是检查浮点数是否“等于”其截断后的整数值。

总之,使用 int() 将浮点数与其整数转换结果进行比较是另一种检查其是否表示整数值的方法。但是,要注意浮点数不精确性可能带来的影响,并考虑使用 is_integer() 以获得更准确的结果。

总结

在本次实验中,你探索了 Python 中浮点数表示的复杂性及其对数值比较的影响。你了解到,由于浮点数在内存中的存储方式,它们通常是实数的近似值,这会导致在进行直接相等性检查时可能出现不准确的情况。

你观察到,将 0.10.2 相加可能不会精确得到 0.3,并且使用 == 进行直接比较可能会产生意外的结果。本次实验强调了理解这些局限性的重要性,以及需要采用替代的比较方法(如使用容差值)来准确评估浮点数的相等性。