【Java】Doubleラッパークラス使い方

Doubleクラスは、基本データ型のdoubleをオブジェクトとして扱うための便利なクラスです。

この記事を読むことで、Doubleクラスの基本的な使い方やメソッド、定数、そして注意点について理解できるようになります。

目次から探す

Doubleラッパークラスとは

Javaには、基本データ型(プリミティブ型)と呼ばれるデータ型があります。

これらの基本データ型は、メモリ効率が良く、操作が高速ですが、オブジェクト指向の特性を持たないため、オブジェクトとして扱うことができません。

そこで登場するのが「ラッパークラス」です。

ラッパークラスは、基本データ型をオブジェクトとして扱うためのクラスです。

ラッパークラスの概要

ラッパークラスは、基本データ型をオブジェクトとして扱うためのクラスです。

Javaには以下のような基本データ型と対応するラッパークラスがあります。

基本データ型ラッパークラス
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

ラッパークラスを使用することで、基本データ型をコレクション(例:ArrayList)に格納したり、メソッドの引数として渡したりすることができます。

また、ラッパークラスには、基本データ型にはない便利なメソッドが多数用意されています。

Doubleクラスの基本的な役割

Doubleクラスは、基本データ型のdoubleをオブジェクトとして扱うためのラッパークラスです。

doubleは浮動小数点数を表すために使用されますが、Doubleクラスを使用することで、以下のような操作が可能になります。

  1. オブジェクトとして扱う: Doubleクラスを使用することで、double型の値をオブジェクトとして扱うことができます。

これにより、コレクションに格納したり、メソッドの引数として渡したりすることができます。

  1. 数値変換: Doubleクラスには、文字列をdouble型に変換するparseDoubleメソッドや、double型の値を文字列に変換するtoStringメソッドなど、数値変換に便利なメソッドが用意されています。
  2. 比較: Doubleクラスには、compareToメソッドequalsメソッドが用意されており、double型の値を比較することができます。
  3. 定数の利用: Doubleクラスには、MAX_VALUEMIN_VALUENaN(Not a Number)、POSITIVE_INFINITYNEGATIVE_INFINITYなどの定数が定義されており、これらを利用することで特定の値を簡単に扱うことができます。

以下に、Doubleクラスの基本的な使い方の例を示します。

public class DoubleExample {
    public static void main(String[] args) {
        // Doubleオブジェクトの生成
        Double doubleObj = Double.valueOf(10.5);
        // 基本データ型doubleとの相互変換
        double primitiveDouble = doubleObj.doubleValue();
        // 数値変換
        String doubleStr = "20.5";
        double parsedDouble = Double.parseDouble(doubleStr);
        // 比較
        Double anotherDoubleObj = Double.valueOf(20.5);
        int comparisonResult = doubleObj.compareTo(anotherDoubleObj);
        // 定数の利用
        double maxDouble = Double.MAX_VALUE;
        double minDouble = Double.MIN_VALUE;
        // 結果の表示
        System.out.println("Doubleオブジェクト: " + doubleObj);
        System.out.println("基本データ型double: " + primitiveDouble);
        System.out.println("文字列から変換したdouble: " + parsedDouble);
        System.out.println("比較結果: " + comparisonResult);
        System.out.println("最大値: " + maxDouble);
        System.out.println("最小値: " + minDouble);
    }
}
Doubleオブジェクト: 10.5
基本データ型double: 10.5
文字列から変換したdouble: 20.5
比較結果: -1
最大値: 1.7976931348623157E308
最小値: 4.9E-324

この例では、Doubleクラスの基本的な使い方を示しています。

Doubleオブジェクトの生成、基本データ型との相互変換、数値変換、比較、定数の利用など、Doubleクラスの主要な機能を網羅しています。

Doubleクラスの基本的な使い方

Doubleオブジェクトの生成

コンストラクタを使用した生成

Doubleクラスのオブジェクトを生成する最も基本的な方法は、コンストラクタを使用することです。

以下の例では、コンストラクタを使用してDoubleオブジェクトを生成しています。

public class Main {
    public static void main(String[] args) {
        // コンストラクタを使用してDoubleオブジェクトを生成
        Double doubleObj = new Double(10.5);
        System.out.println("Doubleオブジェクト: " + doubleObj);
    }
}

このコードを実行すると、以下のような出力が得られます。

Doubleオブジェクト: 10.5

valueOfメソッドを使用した生成

Doubleクラスには、文字列や基本データ型の値からDoubleオブジェクトを生成するための静的メソッドvalueOfも用意されています。

以下の例では、valueOfメソッドを使用してDoubleオブジェクトを生成しています。

public class Main {
    public static void main(String[] args) {
        // valueOfメソッドを使用してDoubleオブジェクトを生成
        Double doubleObj1 = Double.valueOf(20.5);
        Double doubleObj2 = Double.valueOf("30.5");
        
        System.out.println("Doubleオブジェクト1: " + doubleObj1);
        System.out.println("Doubleオブジェクト2: " + doubleObj2);
    }
}

このコードを実行すると、以下のような出力が得られます。

Doubleオブジェクト1: 20.5
Doubleオブジェクト2: 30.5

基本データ型doubleとの相互変換

オートボクシングとアンボクシング

Javaでは、基本データ型と対応するラッパークラスの間で自動的に変換が行われる機能があります。

これをオートボクシング(自動ボクシング)とアンボクシング(自動アンボクシング)と呼びます。

オートボクシングは、基本データ型の値が自動的に対応するラッパークラスのオブジェクトに変換されることを指します。

アンボクシングはその逆で、ラッパークラスのオブジェクトが自動的に基本データ型の値に変換されることを指します。

以下の例では、オートボクシングとアンボクシングの動作を示しています。

public class Main {
    public static void main(String[] args) {
        // オートボクシング
        Double doubleObj = 40.5; // 基本データ型doubleがDoubleオブジェクトに自動変換される
        System.out.println("オートボクシング: " + doubleObj);
        
        // アンボクシング
        double doubleValue = doubleObj; // Doubleオブジェクトが基本データ型doubleに自動変換される
        System.out.println("アンボクシング: " + doubleValue);
    }
}

このコードを実行すると、以下のような出力が得られます。

オートボクシング: 40.5
アンボクシング: 40.5

doubleValueメソッドの使用

Doubleオブジェクトから基本データ型doubleの値を取得するためには、doubleValueメソッドを使用します。

以下の例では、doubleValueメソッドを使用してDoubleオブジェクトから基本データ型doubleの値を取得しています。

public class Main {
    public static void main(String[] args) {
        // Doubleオブジェクトを生成
        Double doubleObj = new Double(50.5);
        
        // doubleValueメソッドを使用して基本データ型doubleの値を取得
        double doubleValue = doubleObj.doubleValue();
        System.out.println("基本データ型doubleの値: " + doubleValue);
    }
}

このコードを実行すると、以下のような出力が得られます。

基本データ型doubleの値: 50.5

以上が、Doubleクラスの基本的な使い方に関する解説です。

次のセクションでは、Doubleクラスのメソッドについて詳しく見ていきます。

Doubleクラスのメソッド

JavaのDoubleクラスには、数値の変換や比較、その他の便利な操作を行うための多くのメソッドが用意されています。

ここでは、代表的なメソッドについて詳しく解説します。

数値変換メソッド

parseDoubleメソッド

parseDoubleメソッドは、文字列を基本データ型のdoubleに変換するためのメソッドです。

例えば、ユーザーから入力された数値を文字列として受け取り、それを数値として扱いたい場合に使用します。

public class ParseDoubleExample {
    public static void main(String[] args) {
        String str = "3.14";
        double num = Double.parseDouble(str);
        System.out.println("文字列をdoubleに変換: " + num);
    }
}

このコードを実行すると、以下のような出力が得られます。

文字列をdoubleに変換: 3.14

toStringメソッド

toStringメソッドは、Doubleオブジェクトを文字列に変換するためのメソッドです。

数値を文字列として表示したい場合に使用します。

public class ToStringExample {
    public static void main(String[] args) {
        Double num = 3.14;
        String str = num.toString();
        System.out.println("doubleを文字列に変換: " + str);
    }
}

このコードを実行すると、以下のような出力が得られます。

doubleを文字列に変換: 3.14

比較メソッド

compareToメソッド

compareToメソッドは、2つのDoubleオブジェクトを比較するためのメソッドです。

このメソッドは、現在のオブジェクトが引数のオブジェクトよりも小さい場合は負の値、等しい場合は0、大きい場合は正の値を返します。

public class CompareToExample {
    public static void main(String[] args) {
        Double num1 = 3.14;
        Double num2 = 2.71;
        int result = num1.compareTo(num2);
        System.out.println("比較結果: " + result);
    }
}

このコードを実行すると、以下のような出力が得られます。

比較結果: 1

equalsメソッド

equalsメソッドは、2つのDoubleオブジェクトが等しいかどうかを判定するためのメソッドです。

このメソッドは、オブジェクトが等しい場合にtrueを返し、そうでない場合にfalseを返します。

public class EqualsExample {
    public static void main(String[] args) {
        Double num1 = 3.14;
        Double num2 = 3.14;
        boolean result = num1.equals(num2);
        System.out.println("等しいかどうか: " + result);
    }
}

このコードを実行すると、以下のような出力が得られます。

等しいかどうか: true

その他の便利なメソッド

isNaNメソッド

isNaNメソッドは、Doubleオブジェクトが「Not-a-Number(NaN)」であるかどうかを判定するためのメソッドです。

NaNは数値ではないことを示す特殊な値です。

public class IsNaNExample {
    public static void main(String[] args) {
        Double num = Double.NaN;
        boolean result = num.isNaN();
        System.out.println("NaNかどうか: " + result);
    }
}

このコードを実行すると、以下のような出力が得られます。

NaNかどうか: true

isInfiniteメソッド

isInfiniteメソッドは、Doubleオブジェクトが無限大であるかどうかを判定するためのメソッドです。

無限大は、数値が非常に大きいか非常に小さい場合に使用される特殊な値です。

public class IsInfiniteExample {
    public static void main(String[] args) {
        Double num = Double.POSITIVE_INFINITY;
        boolean result = num.isInfinite();
        System.out.println("無限大かどうか: " + result);
    }
}

このコードを実行すると、以下のような出力が得られます。

無限大かどうか: true

以上が、Doubleクラスの代表的なメソッドの使い方です。

これらのメソッドを活用することで、数値の変換や比較、特殊な値の判定など、さまざまな操作を簡単に行うことができます。

Doubleクラスの定数

JavaのDoubleクラスには、いくつかの定数が定義されています。

これらの定数は、特定の状況で非常に便利です。

ここでは、MAX_VALUEMIN_VALUENaNPOSITIVE_INFINITYNEGATIVE_INFINITYについて詳しく説明します。

MAX_VALUEとMIN_VALUE

Doubleクラスには、MAX_VALUEMIN_VALUEという2つの定数が定義されています。

これらは、それぞれdouble型で表現できる最大値と最小値を示します。

  • MAX_VALUE: double型で表現できる最大の正の有限値です。
  • MIN_VALUE: double型で表現できる最小の正の非ゼロ値です。

以下に、これらの定数を使用した例を示します。

public class DoubleConstantsExample {
    public static void main(String[] args) {
        // Double型の最大値
        double maxValue = Double.MAX_VALUE;
        System.out.println("Double型の最大値: " + maxValue);
        // Double型の最小値
        double minValue = Double.MIN_VALUE;
        System.out.println("Double型の最小値: " + minValue);
    }
}

このプログラムを実行すると、以下のような出力が得られます。

Double型の最大値: 1.7976931348623157E308
Double型の最小値: 4.9E-324

NaNとPOSITIVE_INFINITY、NEGATIVE_INFINITY

Doubleクラスには、数値演算で特定の状況に対応するための特別な定数も定義されています。

これらの定数は、NaNPOSITIVE_INFINITYNEGATIVE_INFINITYです。

  • NaN (Not a Number): 数値ではないことを示す定数です。

例えば、0を0で割った結果や、負の数の平方根を計算した結果などがNaNになります。

  • POSITIVE_INFINITY: 正の無限大を示す定数です。

非常に大きな数値の演算結果がこの値になることがあります。

  • NEGATIVE_INFINITY: 負の無限大を示す定数です。

非常に小さな数値の演算結果がこの値になることがあります。

以下に、これらの定数を使用した例を示します。

public class DoubleSpecialValuesExample {
    public static void main(String[] args) {
        // NaNの例
        double nanValue = Double.NaN;
        System.out.println("NaNの値: " + nanValue);
        // 正の無限大の例
        double positiveInfinity = Double.POSITIVE_INFINITY;
        System.out.println("正の無限大の値: " + positiveInfinity);
        // 負の無限大の例
        double negativeInfinity = Double.NEGATIVE_INFINITY;
        System.out.println("負の無限大の値: " + negativeInfinity);
        // NaNの生成例
        double result = 0.0 / 0.0;
        System.out.println("0.0 / 0.0 の結果: " + result);
        // 正の無限大の生成例
        double largeNumber = 1.0 / 0.0;
        System.out.println("1.0 / 0.0 の結果: " + largeNumber);
        // 負の無限大の生成例
        double smallNumber = -1.0 / 0.0;
        System.out.println("-1.0 / 0.0 の結果: " + smallNumber);
    }
}

このプログラムを実行すると、以下のような出力が得られます。

NaNの値: NaN
正の無限大の値: Infinity
負の無限大の値: -Infinity
0.0 / 0.0 の結果: NaN
1.0 / 0.0 の結果: Infinity
-1.0 / 0.0 の結果: -Infinity

これらの定数を理解しておくことで、数値演算の結果を正確に処理し、予期しないエラーを防ぐことができます。

Doubleクラスの使用例

基本的な使用例

Doubleクラスは、基本データ型のdoubleをオブジェクトとして扱うためのラッパークラスです。

以下に、Doubleクラスの基本的な使用例を示します。

public class DoubleExample {
    public static void main(String[] args) {
        // Doubleオブジェクトの生成
        Double doubleObj1 = new Double(10.5);
        Double doubleObj2 = Double.valueOf(20.5);
        // 基本データ型doubleとの相互変換
        double primitiveDouble = doubleObj1.doubleValue();
        // 数値の比較
        int comparisonResult = doubleObj1.compareTo(doubleObj2);
        // 結果の表示
        System.out.println("Doubleオブジェクト1: " + doubleObj1);
        System.out.println("Doubleオブジェクト2: " + doubleObj2);
        System.out.println("基本データ型double: " + primitiveDouble);
        System.out.println("比較結果: " + comparisonResult);
    }
}

このプログラムを実行すると、以下のような出力が得られます。

Doubleオブジェクト1: 10.5
Doubleオブジェクト2: 20.5
基本データ型double: 10.5
比較結果: -1

実践的な使用例

数値の比較

Doubleクラスを使用して数値を比較する方法を示します。

compareToメソッドequalsメソッドを使用して、数値の大小や等価性を確認できます。

public class DoubleComparison {
    public static void main(String[] args) {
        Double doubleObj1 = Double.valueOf(15.0);
        Double doubleObj2 = Double.valueOf(20.0);
        Double doubleObj3 = Double.valueOf(15.0);
        // compareToメソッドによる比較
        int result1 = doubleObj1.compareTo(doubleObj2); // -1
        int result2 = doubleObj1.compareTo(doubleObj3); // 0
        // equalsメソッドによる比較
        boolean isEqual = doubleObj1.equals(doubleObj3); // true
        // 結果の表示
        System.out.println("doubleObj1とdoubleObj2の比較結果: " + result1);
        System.out.println("doubleObj1とdoubleObj3の比較結果: " + result2);
        System.out.println("doubleObj1とdoubleObj3は等しいか: " + isEqual);
    }
}

このプログラムを実行すると、以下のような出力が得られます。

doubleObj1とdoubleObj2の比較結果: -1
doubleObj1とdoubleObj3の比較結果: 0
doubleObj1とdoubleObj3は等しいか: true

数値の変換とフォーマット

Doubleクラスを使用して文字列から数値への変換や、数値を文字列に変換する方法を示します。

また、数値のフォーマットも行います。

import java.text.DecimalFormat;
public class DoubleConversion {
    public static void main(String[] args) {
        // 文字列から数値への変換
        String str = "123.45";
        Double doubleObj = Double.parseDouble(str);
        // 数値を文字列に変換
        String strFromDouble = doubleObj.toString();
        // 数値のフォーマット
        DecimalFormat df = new DecimalFormat("#.##");
        String formattedDouble = df.format(doubleObj);
        // 結果の表示
        System.out.println("文字列から変換した数値: " + doubleObj);
        System.out.println("数値から変換した文字列: " + strFromDouble);
        System.out.println("フォーマットされた数値: " + formattedDouble);
    }
}

このプログラムを実行すると、以下のような出力が得られます。

文字列から変換した数値: 123.45
数値から変換した文字列: 123.45
フォーマットされた数値: 123.45

このように、Doubleクラスを使用することで、数値の比較や変換、フォーマットなどの操作を簡単に行うことができます。

これらの機能を活用することで、より柔軟で効率的なプログラムを作成することが可能です。

Doubleクラスの注意点

精度の問題

Doubleクラスを使用する際に注意すべき点の一つは、浮動小数点数の精度の問題です。

浮動小数点数は、有限のビット数で無限の実数を表現するため、どうしても誤差が生じます。

特に、非常に小さい数値や非常に大きい数値を扱う場合、または繰り返し計算を行う場合に、この誤差が顕著になります。

例えば、以下のコードを見てください。

public class DoublePrecisionExample {
    public static void main(String[] args) {
        double a = 0.1;
        double b = 0.2;
        double c = a + b;
        System.out.println("0.1 + 0.2 = " + c);
    }
}
0.1 + 0.2 = 0.30000000000000004

このコードを実行すると、期待される結果は 0.1 + 0.2 = 0.3 ですが、実際には 0.1 + 0.2 = 0.30000000000000004 と表示されることがあります。

これは、浮動小数点数の表現における誤差が原因です。

このような精度の問題を回避するためには、BigDecimalクラスを使用することが推奨されます。

BigDecimalクラスは、任意の精度で数値を扱うことができるため、金融計算などの精度が重要な場面で特に有用です。

import java.math.BigDecimal;
public class BigDecimalExample {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("0.1");
        BigDecimal b = new BigDecimal("0.2");
        BigDecimal c = a.add(b);
        System.out.println("0.1 + 0.2 = " + c);
    }
}
0.1 + 0.2 = 0.3

このコードを実行すると、期待通り 0.1 + 0.2 = 0.3 と表示されます。

NullPointerExceptionのリスク

Doubleクラスを使用する際のもう一つの注意点は、NullPointerExceptionのリスクです。

Doubleクラスはオブジェクト型であるため、null値を持つことができます。

これに対して、基本データ型のdoubleはnull値を持つことができません。

例えば、以下のコードを見てください。

public class NullPointerExample {
    public static void main(String[] args) {
        Double d = null;
        try {
            double primitiveD = d; // ここでNullPointerExceptionが発生する
        } catch (NullPointerException e) {
            System.out.println("NullPointerExceptionが発生しました");
        }
    }
}
NullPointerExceptionが発生しました

このコードを実行すると、「NullPointerExceptionが発生しました」と表示されます。

これは、Doubleオブジェクトがnullであるため、基本データ型のdoubleに変換しようとした際に例外が発生するためです。

このリスクを回避するためには、Doubleオブジェクトがnullでないことを確認するか、Optionalクラスを使用してnull値を安全に扱う方法があります。

import java.util.Optional;
public class OptionalExample {
    public static void main(String[] args) {
        Optional<Double> optionalD = Optional.ofNullable(null);
        double primitiveD = optionalD.orElse(0.0); // nullの場合は0.0を使用
        System.out.println("値: " + primitiveD);
    }
}
値: 0.0

このコードを実行すると、「値: 0.0」と表示され、NullPointerExceptionは発生しません。

Optionalクラスを使用することで、null値を安全に扱うことができます。

目次から探す