Java で数値がゼロかどうかをチェックする方法

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Java で数値がゼロかどうかをチェックする方法を学びます。この基本的なスキルは、条件文を使用してプログラムの流れを制御するために重要です。まず、整数値をゼロと比較するための等価演算子 (==) の使用方法を探ります。

その後、精度の問題により浮動小数点数とゼロを扱う際の具体的な考慮事項と潜在的な落とし穴について説明します。最後に、プリミティブ型の Java ラッパークラスを使用する際にゼロチェックを行う方法を調べます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java/BasicSyntaxGroup -.-> java/data_types("Data Types") java/BasicSyntaxGroup -.-> java/operators("Operators") java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/BasicSyntaxGroup -.-> java/math("Math") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/wrapper_classes("Wrapper Classes") java/SystemandDataProcessingGroup -.-> java/math_methods("Math Methods") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/data_types -.-> lab-559971{{"Java で数値がゼロかどうかをチェックする方法"}} java/operators -.-> lab-559971{{"Java で数値がゼロかどうかをチェックする方法"}} java/variables -.-> lab-559971{{"Java で数値がゼロかどうかをチェックする方法"}} java/if_else -.-> lab-559971{{"Java で数値がゼロかどうかをチェックする方法"}} java/math -.-> lab-559971{{"Java で数値がゼロかどうかをチェックする方法"}} java/wrapper_classes -.-> lab-559971{{"Java で数値がゼロかどうかをチェックする方法"}} java/math_methods -.-> lab-559971{{"Java で数値がゼロかどうかをチェックする方法"}} java/object_methods -.-> lab-559971{{"Java で数値がゼロかどうかをチェックする方法"}} end

等価演算子を使ったゼロチェック

このステップでは、Java で等価演算子を使用して数値がゼロに等しいかどうかをチェックする方法を探ります。これはプログラミングにおける基本的な操作で、条件文でプログラムの流れを制御する際によく使用されます。

Java では、等価演算子は == で表されます。これは 2 つの値を比較し、等しい場合は true を返し、そうでない場合は false を返します。

これを実証するために、簡単な Java プログラムを作成しましょう。

  1. WebIDE エディタで HelloJava.java ファイルが開いていない場合は、開きます。

  2. ファイルの内容全体を次のコードに置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            int number = 0;
    
            if (number == 0) {
                System.out.println("The number is zero.");
            } else {
                System.out.println("The number is not zero.");
            }
        }
    }

    この新しいコードを分解してみましょう。

    • int number = 0;: この行は、number という名前の整数変数を宣言し、値 0 で初期化します。
    • if (number == 0): これは if 文で、コード内で判断を行うために使用されます。括弧内の条件 (number == 0) は、number 変数の値が 0 に等しいかどうかをチェックします。
    • System.out.println("The number is zero.");: この行は、条件 number == 0true の場合にのみ実行されます。
    • else: このキーワードは、if 条件が false の場合に実行されるコードブロックを導入します。
    • System.out.println("The number is not zero.");: この行は、条件 number == 0false の場合にのみ実行されます。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. では、修正したプログラムをコンパイルしましょう。ターミナルで、~/project ディレクトリにいることを確認してください。必要に応じて cd ~/project を使用できます。次に、以下を実行します。

    javac HelloJava.java

    コンパイルが成功すると、何も出力されません。

  5. 最後に、プログラムを実行しましょう。

    java HelloJava

    次の出力が表示されるはずです。

    The number is zero.

    これにより、プログラムが == 演算子を使用して number 変数がゼロに等しいかどうかを正しくチェックしたことが確認できます。

今度は、number 変数の値を非ゼロの値(例:int number = 5;)に変更し、ファイルを保存し、再コンパイルして、プログラムを再度実行して、異なる出力を確認してみてください。

浮動小数点数の精度の扱い

このステップでは、プログラミングにおいて浮動小数点数(小数点付きの数値)を扱う際の一般的な問題である精度について探ります。コンピュータがこれらの数値を格納する方法のため、== を使用した直接的な等価比較は、時に予期しない結果をもたらすことがあります。

実際に見てみましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。

  2. 既存のコードを次のコードに置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            double num1 = 0.1 + 0.2;
            double num2 = 0.3;
    
            System.out.println("num1: " + num1);
            System.out.println("num2: " + num2);
    
            if (num1 == num2) {
                System.out.println("num1 is equal to num2.");
            } else {
                System.out.println("num1 is not equal to num2.");
            }
        }
    }

    このコードでは:

    • 2 つの double 型の変数 num1num2 を宣言しています。double は Java で浮動小数点数を格納するために使用されるデータ型です。
    • num10.1 + 0.2 を、num20.3 を代入しています。数学的にはこれらは等しいはずです。
    • num1num2 の値を出力して、その正確な表現を確認しています。
    • == 演算子を使用して、num1num2 に等しいかどうかをチェックしています。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. ターミナルでプログラムをコンパイルします。

    javac HelloJava.java
  5. コンパイルしたプログラムを実行します。

    java HelloJava

    出力は意外なものになるかもしれません。

    num1: 0.30000000000000004
    num2: 0.3
    num1 is not equal to num2.

    ご覧の通り、浮動小数点数の格納方法のため、num1 は正確に 0.3 ではありません。これは一般的な問題であり、== を使用して浮動小数点数を直接等価比較することは一般的に推奨されません。

これを解決するために、正確な等価性をチェックする代わりに、通常は 2 つの数値の絶対差が非常に小さい許容範囲(しばしば「イプシロン」と呼ばれます)内にあるかどうかをチェックします。

このアプローチを使用するようにコードを修正しましょう。

  1. 再度 HelloJava.java を開きます。

  2. if 文を次のコードに置き換えます。

    double epsilon = 0.000001; // A small tolerance
    
    if (Math.abs(num1 - num2) < epsilon) {
        System.out.println("num1 is approximately equal to num2.");
    } else {
        System.out.println("num1 is not approximately equal to num2.");
    }

    ここで:

    • 小さな epsilon 値を定義しています。
    • Math.abs(num1 - num2)num1num2 の絶対差を計算します。
    • この絶対差が epsilon より小さいかどうかをチェックしています。
  3. ファイルを保存します。

  4. プログラムをコンパイルします。

    javac HelloJava.java
  5. プログラムを実行します。

    java HelloJava

    今度は出力は次のようになるはずです。

    num1: 0.30000000000000004
    num2: 0.3
    num1 is approximately equal to num2.

    これは、精度の制限を考慮して浮動小数点数を実用的な等価性で比較する正しい方法を示しています。

ラッパークラスを使ったテスト

このステップでは、Java のラッパークラスにおける等価性の動作を探ります。ラッパークラスは、プリミティブデータ型(intdoubleboolean など)をオブジェクトとして使用する方法を提供する特殊なクラスです。たとえば、int のラッパークラスは Integer で、double のラッパークラスは Double です。

Java でオブジェクトを比較する場合、== 演算子は 2 つの変数がメモリ内の まったく同じオブジェクト を参照しているかどうかをチェックし、それらの値が等しいかどうかではありません。オブジェクトの を比較するには、equals() メソッドを使用する必要があります。

これがラッパークラスにどのように適用されるか見てみましょう。

  1. WebIDE エディタで HelloJava.java ファイルを開きます。

  2. 既存のコードを次のコードに置き換えます。

    public class HelloJava {
        public static void main(String[] args) {
            Integer intObj1 = new Integer(100);
            Integer intObj2 = new Integer(100);
            Integer intObj3 = intObj1; // intObj3 refers to the same object as intObj1
    
            System.out.println("Comparing Integer objects with ==:");
            if (intObj1 == intObj2) {
                System.out.println("intObj1 == intObj2 is true");
            } else {
                System.out.println("intObj1 == intObj2 is false");
            }
    
            if (intObj1 == intObj3) {
                System.out.println("intObj1 == intObj3 is true");
            } else {
                System.out.println("intObj1 == intObj3 is false");
            }
    
            System.out.println("\nComparing Integer objects with equals():");
            if (intObj1.equals(intObj2)) {
                System.out.println("intObj1.equals(intObj2) is true");
            } else {
                System.out.println("intObj1.equals(intObj2) is false");
            }
    
            if (intObj1.equals(intObj3)) {
                System.out.println("intObj1.equals(intObj3) is true");
            } else {
                System.out.println("intObj1.equals(intObj3) is false");
            }
        }
    }

    このコードでは:

    • new Integer() を使用して、同じ値(100)を持つ 2 つの Integer オブジェクト intObj1intObj2 を作成します。これにより、メモリ内に 2 つの別個のオブジェクトが作成されます。
    • intObj3 を作成し、intObj1 を代入します。これは、intObj3intObj1 がメモリ内の 同じ オブジェクトを指すことを意味します。
    • == を使用して、intObj1intObj2 および intObj3 と比較します。
    • equals() メソッドを使用して、intObj1intObj2 および intObj3 と比較します。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. ターミナルでプログラムをコンパイルします。

    javac HelloJava.java
  5. コンパイルしたプログラムを実行します。

    java HelloJava

    出力は次のようになるはずです。

    Comparing Integer objects with ==:
    intObj1 == intObj2 is false
    intObj1 == intObj3 is true
    
    Comparing Integer objects with equals():
    intObj1.equals(intObj2) is true
    intObj1.equals(intObj3) is true

    この出力は明らかに違いを示しています。

    • intObj1 == intObj2false です。なぜなら、値は同じでも、メモリ内の異なるオブジェクトであるからです。
    • intObj1 == intObj3true です。なぜなら、まったく同じオブジェクトを参照しているからです。
    • intObj1.equals(intObj2)true です。なぜなら、equals() メソッドはオブジェクトの を比較し、どちらも 100 であるからです。
    • intObj1.equals(intObj3)true です。なぜなら、同じオブジェクトを参照しており、値も同じだからです。

    重要な注意: 小さな整数値(通常は -128 から 127)については、Java は Integer オブジェクトのキャッシュを使用します。これは、Integer intObjA = 50; Integer intObjB = 50; の場合、intObjA == intObjBtrue になる可能性があることを意味します。なぜなら、同じキャッシュされたオブジェクトを参照している可能性があるからです。ただし、等価性チェックでこのキャッシュ動作に依存することは推奨されません。常に equals() メソッドを使用してラッパークラスオブジェクトの値を比較してください。

このステップでは、Java でのプリミティブ型とオブジェクトの比較の重要な違い、およびオブジェクトの値を比較する際の equals() メソッドの重要性を強調しています。

まとめ

この実験では、Java で数値がゼロかどうかをチェックする方法を学びました。まず、if 文の中で基本的な等価演算子 (==) を使用して、整数変数とゼロを比較しました。これにより、数値の等価性に基づく条件付きチェックの基本原則が示されました。

次に、浮動小数点数を扱う際の微妙な点と、== を使用して浮動小数点数を直接ゼロと比較する際に発生する可能性のある精度の問題を探りました。最後に、Java のラッパークラスを使ってゼロチェックを行う方法を調べ、基になるプリミティブ値にアクセスして比較する方法を理解しました。