次のプログラムは 12.3 + 45.6 という計算をして結果を出力します。
class Keisan { public static void main(String[] args) { System.out.println(12.3 + 45.6); } }
コンパイルして実行してみると,
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言語などと同様に,掛け算は *
,割り算は /
で表します。また,通常の計算と同じように,次の順番で計算をします。
( )
の中a * b
,a / b
a + b
,a - b
注意すべき点は,整数どうしの計算なら,答えも切り捨てて整数にされてしまうことです。たとえば
System.out.println("答えは " + (8 / 3) + " です。");
の答えは 2.666… にならず,切り捨てて 2 になってしまいます。切り捨てられたくなければ,
System.out.println("答えは " + (8.0 / 3) + " です。");
のように,どちらかの数(または両方)に小数点を付けます。
上のプログラムは「答えは 2.6666666666666665 です。」と出力します。末位の数字は正しくないかもしれません(この場合は明らかに正しくありません)。
以上で,Javaの計算の基本は終わりです。このレッスンの残りは,さらに詳しく知りたい人のためのものです。
小数点の付いた非常に大きい値や非常に小さい値は,指数表示になります。たとえば
System.out.println(314159265357989.0);
とすると,
3.14159265357989E14
と出力されます。この3.14159……E14は 3.14159……×1014 の意味です。言い換えれば,E14は小数点を右に14個動かすことです。また
System.out.println(0.00000314159265357989);
とすると,
3.14159265357989E-6
と出力されます。この3.14159……E-6は 3.14159……×10-6 の意味です。言い換えれば,E-6は小数点を左に6個動かすことです。
次のプログラムは2の平方根を計算して出力します。
class Test { public static void main(String[] args) { System.out.println("ルート2は " + Math.sqrt(2.0) + "です。"); } }
実行すると
ルート2は 1.4142135623730951 です。
と画面に現れます。
Math.sqrt()
が平方根を求める関数です。これ以外にも次のようなたくさんの関数が使えます。
次のものは引数も含めすべて double
型です。角度の単位はすべてラジアンです。
Math.E
Math.PI
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)
a
の b
乗Math.random()
次は,引数が float
型なら返す値は int
型,引数が double
型なら返す値は long
型です。
Math.round(a)
a
を整数に丸めた値次の三つは,引数が int
,long
,float
,double
のどれでもかまいません。返す値の型は引数の型と同じになります。
Math.abs(a)
Math.max(a, b)
Math.min(a, b)
JDK 1.3 から Math
以外に StrictMath
というクラスが新設されました。
StrictMath
は,機種依存性をなくすため,Netlib
の fdlibm (Freely Distributable Math Library)
ライブラリのアルゴリズム(計算方法)で計算することになっています。
そのため,StrictMath
はCPUによらずまったく同じ結果を与えますが,Math
のほうがより高速でありえます。
もっとも,現状では Math
の多くの関数が単に StrictMath
のものを呼び出しているだけです。
三角関数などを多用する場合は,Java より C/C++ のほうが現状では有利です。
Java で計算に使う数値の型には,次のものがあります。
int
型long
型float
型double
型同じ 123 という数値でも,書き方によって,どの型として扱われるかが違います。
123
……int
型123L
または 123l
……long
型123.0
または 123.0d
または 123.0D
……double
型123.0f
または 123.0F
……float
型int
型どうしの計算は,答えも int
型の範囲で求められます。int
型の最大値は 2147483647 です。これ以上になると,マイナスの値に折り返されます。たとえば
System.out.println(2147483647 + 1);
を実行すると -2147483648 と出力されてしまいます。
これを避けるには,どちらか(または両方)を long
型にします。
System.out.println(2147483647L + 1);
これなら long
型として計算されるので,2147483648 になります。
float
型と double
型の混合演算の場合も,どちらかが double
であれば結果は double
になります。
乱数とは,さいころを振って得られるようなでたらめな数のことです。
Javaで乱数を発生させるには,Math.random()
という関数を使うのが一番わかりやすいでしょう。これは0以上1未満のでたらめな数を返してきます。実際にはこれを何倍かして,小数点以下を切り捨てて整数にして使うことが多いと思います。たとえば0から9までのでたらめな整数を作るには,
(int)(10 * Math.random())
のように,10倍して整数化します。もっと具体的なプログラムの形にすれば,
class X { public static void main(String[] args) { for (int i = 0; i < 20; i++) System.out.println((int)(10 * Math.random())); } }
を実行すると,0から9までのでたらめな整数が20個出力されます。
クラスやメソッドの名前に strictfp
という修飾語を付けると,その中の浮動小数点演算を厳密に IEEE 754
に従って行います。
Last modified: 2005-12-25 17:33:20