計算

次のprogramは 12.3 + 45.6 という計算をして結果を出力します。

class Keisan {
    public static void main(String args[]) {
        System.out.println(12.3 + 45.6);
    }
}

compileして実行してみると,

57.9
と出力されます。

また,

答えは 57.9 です。
と画面に出力するには,次のようにします。
class Keisan {
    public static void main(String args[]) {
        System.out.println("答えは " + (12.3 + 45.6) + " です。");
    }
}

ここでは「+」の記号が三つ使ってあります。真ん中の

        (12.3 + 45.6)
が,実際に足し算をする部分です。この結果は 57.9 ですから, この命令全体は
        System.out.println("答えは " + 57.9 + " です。");
と書くのと同じことになります。この 57.9 の両側の + は, 数の足し算ではなく,単に文字列をつなぎ合わせるだけです。 最終的には
        System.out.println("答えは 57.9 です。");
と書いたのと同じことになります。

もし間違って

        System.out.println("答えは " + 12.3 + 45.6 + " です。");
としてしまったら,画面には
答えは 12.345.6 です。
のように,単に文字列としてつなぎ合わせたものが出てしまいます。

Javaの計算では,Cなどと同様に, 掛け算は *,割り算は / で表します。 また,計算の順序は以下のようになります。

  1. かっこ ( ) の中
  2. 掛け算・割り算 a * ba / b
  3. 足し算・引き算 a + ba - b

注意すべき点は,整数どうしの計算なら, 答えも切り捨てて整数にされてしまうことです。 たとえば

        System.out.println("答えは " + (8 / 3) + " です。");
の答えは 2.666… にならず,切り捨てて 2 になってしまいます。 切り捨てられたくなければ,
        System.out.println("答えは " + (8.0 / 3) + " です。");
のように,どちらかの数(または両方)に小数点を付けます。

指数表示

小数点の付いた非常に大きい値や非常に小さい値は,指数表示になります。 たとえば

        System.out.println(3141592.65);
とすると,
3.14159e+06(Solaris 2上のJDK)
などと出力されます。 この3.14159e+06は 3.14159×106 の意味です。 言い換えれば,e+06は小数点を右に6個動かすことです。また
        System.out.println(0.00000314159265);
とすると,
3.14159e-06(Solaris 2上のJDK)
と出力されます。 この3.14159e-06は 3.14159×10-6 の意味です。 言い換えれば,e-06は小数点を左に6個動かすことです。

数学関数

次のprogramは2の平方根を計算して出力します。

class Test {
    public static void main(String args[]) {
        System.out.println("ルート2は " + Math.sqrt(2.0) + "です。");
    }
}

実行すると「ルート2は 1.41421 です」と画面に現れます。

Math.sqrt() が平方根を求める関数です。 これ以外にも次のようなたくさんの関数が使えます。 機種依存性をなくすため, Netlib(http://netlib.att.com)の fdlibm ライブラリの アルゴリズム(計算方法)で計算することになっています。

次のものは引数も含めすべて double 型です。 角度の単位はすべてラジアンです。

Math.E
自然対数の底 2.7182818284590452354
Math.PI
円周率 3.14159265358979323846
Math.sin(a)
サイン
Math.cos(a)
コサイン
Math.tan(a)
タンジェント
Math.asin(a)
アークサイン
Math.acos(a)
アークコサイン
Math.atan(a)
アークタンジェント
Math.exp(a)
指数関数
Math.log(a)
対数関数
Math.sqrt(a)
平方根
Math.IEEEremainder(f1, f2)
f1÷f2 の剰余
Math.ceil(a)
a を超えない最大の整数
Math.floor(a)
a より小さくない最小の整数
Math.rint(a)
整数に丸める
Math.atan2(a, b)
(a, b) の偏角
Math.pow(a, b)
ab
Math.random()
0以上1未満の乱数

次は,引数が float 型なら返す値は int 型, 引数が double 型なら返す値は long 型です。

Math.round(a)
a を整数に丸めた値

次の三つは, 引数が intlongfloatdouble の どれでもかまいません。返す値の型は引数の型と同じになります。

Math.abs(a)
絶対値
Math.max(a, b)
a と b の大きい方の値(a と b は同じ型)
Math.min(a, b)
a と b の小さい方の値(a と b は同じ型)

演算のルール

Java で計算に使う数値の型には,次のものがあります。

int
32ビット整数 (-21474836482147483647
long
64ビット整数 (-92233720368547758089223372036854775807
float
32ビット(単精度)実数, 約6桁精度,範囲 ±3.40282×1038
double
64ビット(倍精度)実数, 約15桁精度,範囲 ±1.79769×10308

同じ 123 という数値でも,書き方によって,どの型として扱われるかが違います。

int 型どうしの計算は,答えも int 型の範囲で求められます。 int 型の最大値は 2147483647 です。これ以上になると, マイナスの値に折り返されます。たとえば

    System.out.println(2147483647 + 1);
を実行すると -2147483648 と出力されてしまいます。

これを避けるには,どちらか(または両方)を long 型にします。

    System.out.println(2147483647L + 1);
これなら long 型として計算されるので,2147483648 になります。

float 型と double 型の混合演算の場合も, どちらかが double であれば結果は double になります。