如何在 Java 中检查一个数字是否为无穷大

JavaJavaBeginner
立即练习

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

简介

在这个实验中,你将学习如何检查 Java 中的 double 类型值表示的是正无穷还是负无穷。在处理可能产生超出标准数值范围结果的浮点计算时,这是一项至关重要的技能,例如涉及除以零的计算。

通过实际操作练习,你将使用 Double.isInfinite() 方法来识别无穷大值,探究除以零如何导致无穷大,并理解无穷大值与 NaN(非数字)之间的区别。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/data_types("Data Types") java/BasicSyntaxGroup -.-> java/operators("Operators") java/SystemandDataProcessingGroup -.-> java/math_methods("Math Methods") java/SystemandDataProcessingGroup -.-> java/system_methods("System Methods") subgraph Lab Skills java/data_types -.-> lab-559964{{"如何在 Java 中检查一个数字是否为无穷大"}} java/operators -.-> lab-559964{{"如何在 Java 中检查一个数字是否为无穷大"}} java/math_methods -.-> lab-559964{{"如何在 Java 中检查一个数字是否为无穷大"}} java/system_methods -.-> lab-559964{{"如何在 Java 中检查一个数字是否为无穷大"}} end

使用 Double.isInfinite() 进行检查

在这一步中,你将学习如何检查 Java 中的 double 类型值表示的是正无穷还是负无穷。在处理可能导致结果超出浮点数正常范围的计算时,这一功能特别有用,例如除以零的计算。

Java 在 Double 类中提供了一个名为 isInfinite() 的内置方法,专门用于此目的。

让我们创建一个简单的 Java 程序,来演示如何使用 Double.isInfinite()

  1. 如果 HelloJava.java 文件尚未在 WebIDE 编辑器中打开,请打开它。你应该位于 ~/project 目录下。

  2. 将文件的全部内容替换为以下代码:

    public class HelloJava {
        public static void main(String[] args) {
            double positiveInfinity = Double.POSITIVE_INFINITY;
            double negativeInfinity = Double.NEGATIVE_INFINITY;
            double finiteNumber = 10.0;
    
            System.out.println("Is positiveInfinity infinite? " + Double.isInfinite(positiveInfinity));
            System.out.println("Is negativeInfinity infinite? " + Double.isInfinite(negativeInfinity));
            System.out.println("Is finiteNumber infinite? " + Double.isInfinite(finiteNumber));
        }
    }

    让我们来看看这段代码的新增部分:

    • double positiveInfinity = Double.POSITIVE_INFINITY;:这行代码声明了一个 double 类型的变量,并将表示正无穷的特殊值赋给它。
    • double negativeInfinity = Double.NEGATIVE_INFINITY;:这行代码声明了一个 double 类型的变量,并将表示负无穷的特殊值赋给它。
    • double finiteNumber = 10.0;:这行代码声明了一个具有有限值的常规 double 类型变量。
    • System.out.println("Is positiveInfinity infinite? " + Double.isInfinite(positiveInfinity));:这行代码调用了 Double.isInfinite() 方法,并将 positiveInfinity 作为参数传入。如果该值是无穷大(正无穷或负无穷),该方法返回 true,否则返回 false。然后将结果打印到控制台。
    • 接下来的两行 System.out.println 代码对 negativeInfinityfiniteNumber 执行了相同的操作。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 现在,让我们编译程序。打开 WebIDE 底部的终端,并确保你位于 ~/project 目录下。运行以下命令:

    javac HelloJava.java

    如果编译成功,你将不会看到任何输出。

  5. 最后,使用 java 命令运行编译后的程序:

    java HelloJava

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

    Is positiveInfinity infinite? true
    Is negativeInfinity infinite? true
    Is finiteNumber infinite? false

这个输出证实了 Double.isInfinite() 能够正确识别正无穷和负无穷,而对于常规的有限数则返回 false

用除以零进行测试

在上一步中,我们了解了 Double.isInfinite() 如何处理预定义的无穷大值。现在,让我们探讨一个在计算中可能出现无穷大的常见场景:除以零。

在标准算术运算中,除以零是未定义的。然而,在浮点运算(double 类型使用的运算方式)中,用一个非零数除以零会根据分子的符号得到正无穷或负无穷。用零除以零,或者用无穷大除以无穷大,会得到一个特殊的值,称为“非数字”(NaN),我们将在下一步中介绍。

让我们修改程序,演示除以零的情况,并使用 Double.isInfinite() 检查结果。

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。你应该位于 ~/project 目录下。

  2. 将当前代码替换为以下代码:

    public class HelloJava {
        public static void main(String[] args) {
            double positiveResult = 10.0 / 0.0;
            double negativeResult = -10.0 / 0.0;
            double zeroResult = 0.0 / 10.0;
    
            System.out.println("Result of 10.0 / 0.0: " + positiveResult);
            System.out.println("Is 10.0 / 0.0 infinite? " + Double.isInfinite(positiveResult));
    
            System.out.println("Result of -10.0 / 0.0: " + negativeResult);
            System.out.println("Is -10.0 / 0.0 infinite? " + Double.isInfinite(negativeResult));
    
            System.out.println("Result of 0.0 / 10.0: " + zeroResult);
            System.out.println("Is 0.0 / 10.0 infinite? " + Double.isInfinite(zeroResult));
        }
    }

    下面是这段新代码的执行逻辑:

    • double positiveResult = 10.0 / 0.0;:我们用一个正数(10.0)除以零(0.0)。在浮点运算中,这会得到正无穷。
    • double negativeResult = -10.0 / 0.0;:我们用一个负数(-10.0)除以零(0.0)。这会得到负无穷。
    • double zeroResult = 0.0 / 10.0;:我们用零(0.0)除以一个非零数(10.0)。这会得到零,零是一个有限数。
    • 然后,我们打印这些除法运算的结果,并使用 Double.isInfinite() 检查每个结果是否为无穷大。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 在终端中编译修改后的程序:

    javac HelloJava.java

    同样,没有输出表示编译成功。

  5. 运行程序:

    java HelloJava

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

    Result of 10.0 / 0.0: Infinity
    Is 10.0 / 0.0 infinite? true
    Result of -10.0 / 0.0: -Infinity
    Is -10.0 / 0.0 infinite? true
    Result of 0.0 / 10.0: 0.0
    Is 0.0 / 10.0 infinite? false

这表明,用非零浮点数除以零会正确地得到无穷大(正无穷或负无穷),并且 Double.isInfinite() 能够准确识别这些结果。用零除以非零数会得到零,零不是无穷大。

区分无穷大与 NaN

在前面的步骤中,你学习了 Double.isInfinite() 方法,以及除以零如何产生无穷大。然而,在浮点运算中还有另一个特殊的值,叫做 NaN,它代表“非数字”(Not a Number)。NaN 表示未定义或无法表示的运算结果,例如零除以零或对负数取平方根。

能够区分无穷大值和 NaN 非常重要,因为它们代表不同类型的异常结果。Java 提供了 Double.isNaN() 方法来检查一个 double 类型的值是否为 NaN。

让我们最后一次修改程序,加入一个会产生 NaN 的计算,并看看如何将其与无穷大区分开来。

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。你应该位于 ~/project 目录下。

  2. 将当前代码替换为以下代码:

    public class HelloJava {
        public static void main(String[] args) {
            double positiveInfinity = 10.0 / 0.0;
            double nanResult = 0.0 / 0.0;
            double finiteNumber = 5.0;
    
            System.out.println("Result of 10.0 / 0.0: " + positiveInfinity);
            System.out.println("Is 10.0 / 0.0 infinite? " + Double.isInfinite(positiveInfinity));
            System.out.println("Is 10.0 / 0.0 NaN? " + Double.isNaN(positiveInfinity));
    
            System.out.println("Result of 0.0 / 0.0: " + nanResult);
            System.out.println("Is 0.0 / 0.0 infinite? " + Double.isInfinite(nanResult));
            System.out.println("Is 0.0 / 0.0 NaN? " + Double.isNaN(nanResult));
    
            System.out.println("Result of 5.0: " + finiteNumber);
            System.out.println("Is 5.0 infinite? " + Double.isInfinite(finiteNumber));
            System.out.println("Is 5.0 NaN? " + Double.isNaN(finiteNumber));
        }
    }

    下面是代码修改的详细说明:

    • double positiveInfinity = 10.0 / 0.0;:保留产生正无穷大的除法运算。
    • double nanResult = 0.0 / 0.0;:这行代码执行零除以零的运算,结果为 NaN。
    • double finiteNumber = 5.0;:一个用于对比的常规有限数。
    • 现在,除了调用 Double.isInfinite() 方法外,还对每个结果调用 Double.isNaN() 方法。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 在终端中编译程序:

    javac HelloJava.java
  5. 运行程序:

    java HelloJava

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

    Result of 10.0 / 0.0: Infinity
    Is 10.0 / 0.0 infinite? true
    Is 10.0 / 0.0 NaN? false
    Result of 0.0 / 0.0: NaN
    Is 0.0 / 0.0 infinite? false
    Is 0.0 / 0.0 NaN? true
    Result of 5.0: 5.0
    Is 5.0 infinite? false
    Is 5.0 NaN? false

这个输出清晰地展示了无穷大值和 NaN 之间的区别。Double.isInfinite() 仅对正无穷或负无穷返回 true,而 Double.isNaN() 仅对 NaN 返回 true。对于有限数,这两个方法都返回 false。理解这种区别对于处理浮点计算中可能出现的错误和意外结果至关重要。

总结

在本次实验中,你学习了如何使用 Double.isInfinite() 方法来检查 Java 中的 double 类型值是否表示正无穷或负无穷。你了解了如何将该方法与预定义的 Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITY 值以及有限数一起使用,从而理解其工作原理。这个方法对于处理浮点计算中可能出现的无穷大结果至关重要。