はじめに
この実験では、Java で数値が double 型であるかどうかを判断する方法を学びます。まずは、instanceof 演算子を使用してオブジェクトが Double ラッパークラスのインスタンスであるかどうかをチェックする方法から、さまざまな手法を探っていきます。
その後、文字列を double 型に変換し、潜在的なエラーを処理する方法を学びます。最後に、Double 型と Integer 型を区別する方法を説明し、正しい数値表現で作業できるようにします。
Double クラスのインスタンスをチェックする
このステップでは、Java の Double クラスを調べ、オブジェクトがこのクラスのインスタンスであるかどうかをチェックする方法を学びます。Java では、double のようなプリミティブデータ型には、Double などの対応するラッパークラスがあります。Double クラスは、倍精度浮動小数点数を扱うための便利なメソッドを提供します。
まず、~/project ディレクトリに DoubleCheck.java という名前の新しい Java ファイルを作成しましょう。これは、左側の WebIDE のファイルエクスプローラーを使用して行うことができます。~/project ディレクトリ内で右クリックし、「New File」を選択して DoubleCheck.java と入力します。
次に、エディタで DoubleCheck.java ファイルを開き、以下のコードを追加します。
public class DoubleCheck {
public static void main(String[] args) {
// Declare a primitive double variable
double primitiveDouble = 123.45;
// Declare a Double object
Double doubleObject = 67.89;
// Declare an Integer object
Integer integerObject = 100;
// Check if primitiveDouble is an instance of Double (This will not work directly)
// System.out.println("Is primitiveDouble an instance of Double? " + (primitiveDouble instanceof Double)); // This line would cause a compile error
// Check if doubleObject is an instance of Double
System.out.println("Is doubleObject an instance of Double? " + (doubleObject instanceof Double));
// Check if integerObject is an instance of Double
System.out.println("Is integerObject an instance of Double? " + (integerObject instanceof Double));
}
}
このコードでは、以下のことを行っています。
- プリミティブな
double型の変数primitiveDoubleを宣言しています。 DoubleオブジェクトdoubleObjectを宣言しています。- 比較のために
IntegerオブジェクトintegerObjectを宣言しています。 instanceof演算子を使用して、doubleObjectとintegerObjectがDoubleクラスのインスタンスであるかどうかをチェックしています。- なお、
instanceof演算子はdoubleのようなプリミティブ型には直接使用できません。
DoubleCheck.java ファイルを保存します。
次に、プログラムをコンパイルして実行しましょう。WebIDE の下部にあるターミナルを開きます。~/project ディレクトリにいることを確認してください。
javac を使用してコードをコンパイルします。
javac DoubleCheck.java
コンパイルエラーがなければ、java を使用してコンパイルされたコードを実行します。
java DoubleCheck
以下のような出力が表示されるはずです。
Is doubleObject an instance of Double? true
Is integerObject an instance of Double? false
この出力は、doubleObject が Double クラスのインスタンスであり、integerObject はそうではないことを確認しています。これは、Java で instanceof 演算子を使用してオブジェクトの型をチェックする方法を示しています。
文字列を Double 型にパースする
このステップでは、Java で数値を表す String を double 型の値に変換する方法を学びます。これは、ユーザー入力やファイルからの読み取りなど、数値入力をテキストとして受け取る際の一般的なタスクです。Double クラスには、この目的のために parseDouble() という静的メソッドが用意されています。
~/project ディレクトリに StringtoDouble.java という名前の新しい Java ファイルを作成しましょう。WebIDE のファイルエクスプローラーを使ってこのファイルを作成します。
StringtoDouble.java を開き、以下のコードを追加します。
public class StringtoDouble {
public static void main(String[] args) {
// A string representing a double value
String doubleString = "987.65";
// Another string representing a double value
String anotherDoubleString = "3.14159";
// A string that is not a valid double
String invalidDoubleString = "hello";
// Parse the strings to double values
try {
double parsedDouble1 = Double.parseDouble(doubleString);
double parsedDouble2 = Double.parseDouble(anotherDoubleString);
System.out.println("Parsed double from \"" + doubleString + "\": " + parsedDouble1);
System.out.println("Parsed double from \"" + anotherDoubleString + "\": " + parsedDouble2);
// Attempt to parse an invalid string (This will cause an error)
// double parsedDouble3 = Double.parseDouble(invalidDoubleString);
// System.out.println("Parsed double from \"" + invalidDoubleString + "\": " + parsedDouble3);
} catch (NumberFormatException e) {
System.out.println("Error parsing string: " + e.getMessage());
}
}
}
このコードでは、以下のことを行っています。
doubleStringとanotherDoubleStringという 2 つの文字列には、有効な double 型の数値表現が含まれています。invalidDoubleStringは有効な数値を表していません。Double.parseDouble()を使用して、有効な文字列をdouble型のプリミティブ値に変換します。- 解析コードを
try-catchブロックで囲んでいます。これは重要です。なぜなら、文字列が有効な double 型に変換できない場合(invalidDoubleStringのような場合)、parseDouble()はNumberFormatExceptionをスローするからです。catchブロックはこのエラーを適切に処理します。
StringtoDouble.java ファイルを保存します。
次に、プログラムをコンパイルして実行しましょう。ターミナルを開き、~/project ディレクトリにいることを確認してください。
コードをコンパイルします。
javac StringtoDouble.java
コンパイルされたコードを実行します。
java StringtoDouble
以下のような出力が表示されるはずです。
Parsed double from "987.65": 987.65
Parsed double from "3.14159": 3.14159
invalidDoubleString を解析しようとする行のコメントを外して再度コードを実行すると、catch ブロックからのエラーメッセージが表示され、プログラムが無効な入力をどのように処理するかがわかります。
このステップでは、数値の文字列表現を実際の double 型の値に変換する方法を示しています。これは、Java プログラムで入力を処理するための重要なスキルです。
Double 型と Integer 型を区別する
このステップでは、Java で double 型と int(整数)型の値をどのように区別するかを探ります。特に、似たような見た目の数値を扱う際に重要です。double 型は小数点付きの数値や整数を表すことができますが、int 型は整数のみを表すことができます。この違いを理解することは、正しいデータ型を選択し、正確な計算を行うために重要です。
WebIDE のファイルエクスプローラーを使って、~/project ディレクトリに NumberTypes.java という名前の新しい Java ファイルを作成しましょう。
NumberTypes.java を開き、以下のコードを追加します。
public class NumberTypes {
public static void main(String[] args) {
// An integer variable
int integerValue = 10;
// A double variable representing a whole number
double doubleValueWhole = 20.0;
// A double variable representing a number with a decimal part
double doubleValueDecimal = 30.5;
// Print the values and their types (implicitly)
System.out.println("Integer value: " + integerValue);
System.out.println("Double value (whole): " + doubleValueWhole);
System.out.println("Double value (decimal): " + doubleValueDecimal);
// Check the type using instanceof (for wrapper classes)
Integer integerObject = 100;
Double doubleObject = 200.0;
System.out.println("Is integerObject an instance of Integer? " + (integerObject instanceof Integer));
System.out.println("Is doubleObject an instance of Double? " + (doubleObject instanceof Double));
System.out.println("Is integerObject an instance of Double? " + (integerObject instanceof Double));
System.out.println("Is doubleObject an instance of Integer? " + (doubleObject instanceof Integer));
// Demonstrate potential issues with comparing double and int
System.out.println("Is integerValue equal to doubleValueWhole? " + (integerValue == doubleValueWhole)); // This comparison works due to type promotion
// System.out.println("Is integerValue equal to doubleValueDecimal? " + (integerValue == doubleValueDecimal)); // This would be false
}
}
このコードでは、以下のことを行っています。
int型の変数integerValueを宣言しています。- 2 つの
double型の変数を宣言しています。1 つは整数を表す (doubleValueWhole) もので、もう 1 つは小数部分を持つ (doubleValueDecimal) ものです。 - これらの値を出力して、その表現を確認します。
- ラッパークラス
IntegerとDoubleを使ってinstanceof演算子を使用し、オブジェクトの型を明示的にチェックします。これは最初のステップで行ったことと同様です。 int型とdouble型の比較も行っています。Java は型昇格を行い、比較の前にint型をdouble型に変換するため、integerValue == doubleValueWholeはtrueと評価されます。
NumberTypes.java ファイルを保存します。
次に、プログラムをコンパイルして実行しましょう。ターミナルを開き、~/project ディレクトリにいることを確認してください。
コードをコンパイルします。
javac NumberTypes.java
コンパイルされたコードを実行します。
java NumberTypes
以下のような出力が表示されるはずです。
Integer value: 10
Double value (whole): 20.0
Double value (decimal): 30.5
Is integerObject an instance of Integer? true
Is doubleObject an instance of Double? true
Is integerObject an instance of Double? false
Is doubleObject an instance of Integer? false
Is integerValue equal to doubleValueWhole? true
この出力は、int 型と double 型の値がどのように格納され、表現されるかの違いを示しています。また、ラッパークラスを使って instanceof 演算子で型をチェックする方法も示しています。double 型は整数値を保持することができますが、基本的には浮動小数点数型であり、整数型とは異なります。
まとめ
この実験では、Java で数値が Double 型であるかどうかをチェックする方法を学びました。まず、Double ラッパークラスを調べ、instanceof 演算子を使用してオブジェクトが Double のインスタンスであるかどうかを判断しました。instanceof は Double オブジェクトに対しては機能しますが、プリミティブな double 型に対しては直接機能しないことがわかりました。



