Java Number & Math クラス

Java Number

一般的に、数値が必要なときは、通常組み込みのデータ型を使用します。例:byte、int、long、doubleなど。

例

int a = 5000; float b = 13.65f; byte c = 0x4a;

しかし、実際の開発プロセスでは、組み込みデータ型ではなくオブジェクトを使用する必要がある状況に頻繁に遭遇します。この問題を解決するために、Java 言語は各組み込みデータ型に対応するラッパークラスを提供しています。

すべてのラッパークラスは(Integer、Long、Byte、Double、Float、Short)抽象クラス Number のサブクラスです。

クラス名対応する基本型説明
Bytebyteバイト型ラッパークラス
Shortshort短整数型ラッパークラス
Integerint整数型ラッパークラス
Longlong長整数型ラッパークラス
Floatfloat単精度浮動小数点型ラッパークラス
Doubledouble倍精度浮動小数点型ラッパークラス
BigInteger-不変の任意精度整数
BigDecimal-不変の任意精度符号付き十進数

Java Number类

このようなコンパイラによって特別にサポートされるラッピングをボクシング(装箱)と呼びます。組み込みデータ型がオブジェクトとして使用されるとき、コンパイラは組み込み型をラッパークラスにボクシングします。同様に、コンパイラはオブジェクトを組み込み型にアンボクシングすることもできます。

Number クラスは java.lang パッケージに属します。

Number は抽象クラスであり、主にさまざまな数値型に統一的な変換メソッドを提供する役割を持ちます:

例

public abstract class Number implements Serializable {
    // 抽象メソッド
    public abstract int intValue();
    public abstract long longValue();
    public abstract float floatValue();
    public abstract double doubleValue();
   
    // Java 8 で追加
    public byte byteValue() {
        return (byte)intValue();
    }
    public short shortValue() {
        return (short)intValue();
    }
}

以下は Integer オブジェクトを使用した例です:

Test.java ファイルコード:

public class Test{ public static void main(String[] args){ Integer x = 5; x = x + 10; System.out.println(x); } }

上記の例をコンパイルして実行した結果は次のとおりです:

15

x に整数値が代入されると、x はオブジェクトであるため、コンパイラは x をボクシングします。その後、x に加算演算を行えるようにするため、x をアンボクシングする必要があります。

よく使うメソッドの例

基本型の変換

例

Number num = 1234.56; // 実際は Double 型です

System.out.println(num.intValue());    // 1234 (小数切り捨て)
System.out.println(num.longValue());   // 1234
System.out.println(num.floatValue());  // 1234.56
System.out.println(num.doubleValue()); // 1234.56

数値の比較

例

java
Integer x = 10;
Double y = 10.0;

// 正しい比較方法:同じ型に変換してから比較する
System.out.println(x.doubleValue() == y.doubleValue()); // true

特殊な数値の処理

大きな数値の処理

例

BigInteger bigInt = new BigInteger("12345678901234567890");
BigDecimal bigDec = new BigDecimal("1234567890.1234567890");

// 大きな数値の演算
BigInteger sum = bigInt.add(new BigInteger("1"));
BigDecimal product = bigDec.multiply(new BigDecimal("2"));

数値のフォーマット

例

NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);

System.out.println(nf.format(1234.5678)); // "1,234.57"

自動ボクシングとアンボクシング

Java 5+ は自動変換をサポートしています:

例

// 自動ボクシング
Integer autoBoxed = 42; // コンパイラは Integer.valueOf(42) に変換します

// 自動アンボクシング
int autoUnboxed = autoBoxed; // コンパイラは autoBoxed.intValue() に変換します

Java Math クラス

Math クラスは Java が提供する数学ユーティリティクラスで、java.lang パッケージにあり、基本的な数値演算を実行する静的メソッドを含みます。

Java の Math には、初等指数、対数、平方根、三角関数などの基本的な数学演算を実行するためのプロパティとメソッドが含まれています。

Math のメソッドはすべて static 形式で定義されており、Math クラスを通じてメイン関数内で直接呼び出すことができます。

Test.java ファイルコード:

public class Test { public static void main (String []args) { System.out.println("90 度の正弦値:" + Math.sin(Math.PI/2)); System.out.println("0 度の余弦値:" + Math.cos(0)); System.out.println("60 度の正接値:" + Math.tan(Math.PI/3)); System.out.println("1 の逆正接値:" + Math.atan(1)); System.out.println("π/2 の角度値:" + Math.toDegrees(Math.PI/2)); System.out.println(Math.PI); } }

上記の例をコンパイルして実行した結果は次のとおりです:

90 度的正弦值:1.0
0度的余弦值:1.0
60度的正切值:1.7320508075688767
1的反正切值: 0.7853981633974483
π/2的角度值:90.0
3.141592653589793

高度な数学演算

1. 指数・対数演算

例

Math.exp(1);    // e^1 ≈ 2.718
Math.log(Math.E); // ln(e) = 1
Math.log10(100); // log10(100) = 2

2. 乱数生成

例

// [0.0, 1.0) の間の乱数を生成
double random = Math.random();

// [1, 100] のランダムな整数を生成
int randomInt = (int)(Math.random() * 100) + 1;

3. その他の演算

例

Math.hypot(3, 4); // sqrt(x²+y²) を計算 → 5.0
Math.IEEEremainder(10, 3); // IEEE 剰余 → 1.0

4. 定数フィールド

例

Math.PI;    // π ≈ 3.141592653589793
Math.E;     // 自然対数の底 e ≈ 2.718281828459045

Number & Math クラスのメソッド

以下の表は、Number & Math クラスでよく使われるメソッドの一部です:

番号 メソッドと説明
1 xxxValue()
Number オブジェクトを xxx データ型の値に変換して返します。
2 compareTo()
number オブジェクトを引数と比較します。
3 equals()
number オブジェクトが引数と等しいかどうかを判定します。
4 valueOf()
指定された組み込みデータ型の Number オブジェクトを返します。
5 toString()
値を文字列形式で返します。
6 parseInt()
文字列を int 型に解析します。
7 abs()
引数の絶対値を返します。
8 ceil()
指定された引数以上(>=)の最小の整数を返します。型は倍精度浮動小数点型です。
9 floor()
指定された引数以下(<=)の最大の整数を返します。
10 rint()
引数に最も近い整数を返します。戻り値の型は double です。
11 round()
これは四捨五入を表し、アルゴリズムはMath.floor(x+0.5)つまり、元の数値に 0.5 を加えた後に切り捨てます。したがって、Math.round(11.5) の結果は 12、Math.round(-11.5) の結果は -11 です。
12 min()
2 つの引数のうち小さい方を返します。
13 max()
2 つの引数のうち大きい方を返します。
14 exp()
自然対数の底 e の引数乗を返します。
15 log()
引数の自然対数(底 e)の値を返します。
16 pow()
最初の引数の 2 番目の引数乗を返します。
17 sqrt()
引数の算術平方根を求めます。
18 sin()
指定された double 型引数の正弦値を求めます。
19 cos()
指定された double 型引数の余弦値を求めます。
20 tan()
指定された double 型引数の正接値を求めます。
21 asin()
指定された double 型引数の逆正弦値を求めます。
22 acos()
指定された double 型引数の逆余弦値を求めます。
23 atan()
指定された double 型引数の逆正接値を求めます。
24 atan2()
デカルト座標を極座標に変換し、極座標の角度値を返します。
25 toDegrees()
引数を角度に変換します。
26 toRadians()
角度をラジアンに変換します。
27 random()
乱数を返します。

Math の floor, round, ceil メソッドの実例比較

パラメータ Math.floor Math.round Math.ceil
1.4 1 1 2
1.5 1 2 2
1.6 1 2 2
-1.4 -2 -1 -1
-1.5 -2 -1 -1
-1.6 -2 -2 -1

floor, round, ceil の例:

public class Main { public static void main(String[] args) { double[] nums = { 1.4, 1.5, 1.6, -1.4, -1.5, -1.6 }; for (double num : nums) { test(num); } } private static void test(double num) { System.out.println("Math.floor(" + num + ")=" + Math.floor(num)); System.out.println("Math.round(" + num + ")=" + Math.round(num)); System.out.println("Math.ceil(" + num + ")=" + Math.ceil(num)); } }

上記の例を実行した出力結果は次のとおりです:

Math.floor(1.4)=1.0
Math.round(1.4)=1
Math.ceil(1.4)=2.0
Math.floor(1.5)=1.0
Math.round(1.5)=2
Math.ceil(1.5)=2.0
Math.floor(1.6)=1.0
Math.round(1.6)=2
Math.ceil(1.6)=2.0
Math.floor(-1.4)=-2.0
Math.round(-1.4)=-1
Math.ceil(-1.4)=-1.0
Math.floor(-1.5)=-2.0
Math.round(-1.5)=-1
Math.ceil(-1.5)=-1.0
Math.floor(-1.6)=-2.0
Math.round(-1.6)=-2
Math.ceil(-1.6)=-1.0
その他の拡張