如何在 Python 中检查一个数字是否接近另一个数字

PythonPythonBeginner
立即练习

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

简介

在这个实验中,你将学习如何在 Python 中检查一个数字是否接近另一个数字,解决浮点数比较的挑战。你将首先了解数值接近度的概念,以及由于计算机表示浮点数的方式,这种比较为何重要,因为在比较浮点数是否相等时,可能会导致意外的结果。一个 Python 脚本将通过计算 0.1 + 0.2 并将结果与 0.3 进行比较来说明这一概念,展示由于浮点数表示方式可能导致的不相等情况。

然后,实验将指导你通过计算两个数字之间的绝对差值,作为确定接近度的一种方法。最后,你将学习如何使用 math.isclose() 函数对浮点数进行更可靠的比较,同时考虑相对容差和绝对容差。


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/ControlFlowGroup -.-> python/conditional_statements("Conditional Statements") python/FunctionsGroup -.-> python/build_in_functions("Build-in Functions") subgraph Lab Skills python/numeric_types -.-> lab-559546{{"如何在 Python 中检查一个数字是否接近另一个数字"}} python/conditional_statements -.-> lab-559546{{"如何在 Python 中检查一个数字是否接近另一个数字"}} python/build_in_functions -.-> lab-559546{{"如何在 Python 中检查一个数字是否接近另一个数字"}} end

理解数值接近度

在这一步中,我们将探讨数值接近度的概念及其在编程中的重要性,尤其是在处理浮点数时。由于计算机表示浮点数的方式,它们通常是实数的近似值。这可能会在比较它们是否相等时导致意外的结果。

数值接近度帮助我们确定两个数字是否“足够接近”,从而可以认为它们相等,即使它们并不完全相同。这在处理涉及浮点运算的计算时特别有用。

让我们通过创建一个 Python 脚本来阐述这个概念。

  1. 在 LabEx 环境中打开 VS Code 编辑器。

  2. ~/project 目录下创建一个名为 proximity.py 的新文件。

    ~/project/proximity.py
  3. 将以下代码添加到 proximity.py 中:

    ## proximity.py
    
    num1 = 0.1 + 0.2
    num2 = 0.3
    
    print(f"num1 is: {num1}")
    print(f"num2 is: {num2}")
    
    if num1 == num2:
        print("num1 and num2 are equal")
    else:
        print("num1 and num2 are not equal")

    这个脚本计算 0.1 + 0.2 并将结果与 0.3 进行比较。

  4. 保存文件并在终端中使用以下命令运行它:

    python ~/project/proximity.py

    你应该会看到类似以下的输出:

    num1 is: 0.30000000000000004
    num2 is: 0.3
    num1 and num2 are not equal

    如你所见,由于浮点数的表示方式,num1num2 并不完全相等,尽管从数学角度来看它们应该相等。这就是数值接近度概念变得重要的地方。在接下来的步骤中,我们将探索处理这种情况的方法。

计算绝对差值

在这一步中,你将学习如何计算两个数字之间的绝对差值。绝对差值是两个数字之间差值的大小,与它们的顺序无关。换句话说,它是两个数字之间的正差值。

你可以使用 Python 中的 abs() 函数来计算绝对差值。abs() 函数返回一个数字的绝对值。

让我们修改上一步中的 proximity.py 脚本,以计算 num1num2 之间的绝对差值。

  1. 使用 VS Code 编辑器打开 ~/project 目录下的 proximity.py 文件。

  2. 修改代码以计算绝对差值:

    ## proximity.py
    
    num1 = 0.1 + 0.2
    num2 = 0.3
    
    print(f"num1 is: {num1}")
    print(f"num2 is: {num2}")
    
    absolute_difference = abs(num1 - num2)
    print(f"The absolute difference between num1 and num2 is: {absolute_difference}")
    
    if absolute_difference < 0.00001:  ## Using a small tolerance
        print("num1 and num2 are approximately equal")
    else:
        print("num1 and num2 are not approximately equal")

    在这段代码中,我们使用 abs() 函数计算 num1num2 之间的绝对差值。然后,我们将绝对差值与一个小的容差值(在本例中为 0.00001)进行比较。如果绝对差值小于容差,我们就认为这两个数字近似相等。

  3. 保存文件并在终端中使用以下命令运行它:

    python ~/project/proximity.py

    你应该会看到类似以下的输出:

    num1 is: 0.30000000000000004
    num2 is: 0.3
    The absolute difference between num1 and num2 is: 4.440892098500626e-17
    num1 and num2 are approximately equal

    现在,该脚本通过考虑绝对差值和容差值,正确地识别出 num1num2 近似相等。这种方法比直接比较浮点数是否相等更为可靠。

使用 math.isclose() 比较浮点数

在这一步中,你将学习如何使用 math.isclose() 函数来比较浮点数是否近似相等。与使用固定容差相比,math.isclose() 函数是一种更可靠且推荐的比较浮点数的方法。

math.isclose() 函数接受两个数字作为输入,如果它们在指定的容差范围内彼此接近,则返回 True,否则返回 False。它提供了两个容差参数:rel_tol(相对容差)和 abs_tol(绝对容差)。

让我们修改上一步中的 proximity.py 脚本,以使用 math.isclose() 函数。

  1. 使用 VS Code 编辑器打开 ~/project 目录下的 proximity.py 文件。

  2. 修改代码以使用 math.isclose()

    ## proximity.py
    
    import math
    
    num1 = 0.1 + 0.2
    num2 = 0.3
    
    print(f"num1 is: {num1}")
    print(f"num2 is: {num2}")
    
    if math.isclose(num1, num2):
        print("num1 and num2 are approximately equal")
    else:
        print("num1 and num2 are not approximately equal")

    在这段代码中,我们导入了 math 模块,并使用 math.isclose() 函数来比较 num1num2。我们使用了 rel_tolabs_tol 的默认值,这些值适用于大多数情况。

  3. 保存文件并在终端中使用以下命令运行它:

    python ~/project/proximity.py

    你应该会看到类似以下的输出:

    num1 is: 0.30000000000000004
    num2 is: 0.3
    num1 and num2 are approximately equal

    现在,脚本使用 math.isclose() 函数正确地识别出 num1num2 近似相等。这是在 Python 中比较浮点数近似相等的推荐方法。

总结

在本次实验中,你首先探索了数值接近性的概念,以及在 Python 中比较浮点数时它的重要性。由于计算机表示浮点数的方式,直接进行相等性比较可能并不可靠。你创建了一个 proximity.py 脚本来说明这个问题,在脚本中比较了 0.1 + 0.20.3,结果显示由于浮点数的表示方式,它们并不完全相等。

接着,本次实验介绍了需要采用其他方法来判断两个数字是否“足够接近”从而可以被视为相等,这为后续步骤中探索诸如计算绝对差值等技术奠定了基础(内容截断)。