Javaでは、整数だけでなく、実数も扱えます。 ここで言う実数は、数学で言う実数と多少異なります。 例えば、数学の円周率は、小数点の後に無限に数字を並べます。 それに対して、Javaの円周率は、小数点の後に15桁しか数字を並べません。 つまり、Javaの実数はわずかに誤差を含んでいるのです。
Javaでは、整数と実数は厳格に区別されます。
実数を書くべき所に整数を書くと、計算結果が変わる場合があります。
確実に実数を表記するには、小数点を用いるのが簡単です。
つまり、実数 0, 1, 2, ... を、
0.0
,
1.0
,
2.0
, ... と書くのです。
もちろん、実数 1.23 なら、そのまま
1.23
と書きます。
実数を書き表すもう一つの方法は、
指数表記
(
exponential notation
)です。
これは、例えば 12300000.0 を 1.23×10
7
と考えて、
1.23E7
と表記する方法です。
つまり、実数の小数点をずらして x.xxx または -x.xxx にし、
E
の後にずらした桁数を書くということです。
指数表記は、非常に大きな数や非常に小さな数を書き表す時に便利です。
以下の表を見て理解してください。
実数 | 指数表記 |
---|---|
12300000.0 |
1.23E7
|
1230000.0 |
1.23E6
|
123000.0 |
1.23E5
|
12300.0 |
1.23E4
|
1230.0 |
1.23E3
|
123.0 |
1.23E2
|
12.3 |
1.23E1
|
1.23 |
1.23E0
|
0.123 |
1.23E-1
|
0.0123 |
1.23E-2
|
0.00123 |
1.23E-3
|
0.000123 |
1.23E-4
|
以下のプログラムは、この表の実数を指数表記で書いています。 Javaでは、数が大きすぎたり小さすぎたりすると指数表記に切り替わります。
/* 1*/ class ExponentTest { // 指数表記のテスト /* 2*/ public static void main (String[] args) { /* 3*/ System.out.println(1.23E7); // 12300000.0 /* 4*/ System.out.println(1.23E6); // 1230000.0 /* 5*/ System.out.println(1.23E5); // 123000.0 /* 6*/ System.out.println(1.23E4); // 12300.0 /* 7*/ System.out.println(1.23E3); // 1230.0 /* 8*/ System.out.println(1.23E2); // 123.0 /* 9*/ System.out.println(1.23E1); // 12.3 /* 10*/ System.out.println(1.23E0); // 1.23 /* 11*/ System.out.println(1.23E-1); // 0.123 /* 12*/ System.out.println(1.23E-2); // 0.0123 /* 13*/ System.out.println(1.23E-3); // 0.00123 /* 14*/ System.out.println(1.23E-4); // 0.000123 /* 15*/ } /* 16*/ }
24102a1:java1 k12x1001$ java ExponentTest Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 1.23E7 1230000.0 123000.0 12300.0 1230.0 123.0 12.3 1.23 0.123 0.0123 0.00123 1.23E-4 24102a1:java1 k12x1001$
整数と同様に、実数でも四則演算が行えます。 特に、割り算については意味が変わります。 整数のときは、7÷2 = 3 余り 1 でしたが、実数のときは、7.0÷2.0 = 3.5 です。
以下のプログラムは、実数の四則演算の例です。
/* 1*/ class OperationTest { // 四則演算のテスト /* 2*/ public static void main (String[] args) { /* 3*/ System.out.println(2.5 + 0.1); /* 4*/ System.out.println(2.5 - 0.1); /* 5*/ System.out.println(2.5 * 0.1); /* 6*/ System.out.println(2.5 / 0.1); /* 7*/ } /* 8*/ }
24102a1:java1 k12x1001$ java OperationTest Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 2.6 2.4 0.25 25.0 24102a1:java1 k12x1001$
ここで、実数の四則演算の結果は実数であることに注意してください。 この例なら、2.5÷0.1 は整数 25 ではなく実数 25.0 です。
注意: 「実数+整数」の場合は、整数を実数に変換してから足し算をします。 他の演算についても同様です。
Javaの実数がわずかに誤差を含むことは、すでに説明しました。 この誤差は、普通の計算を行う場合は、ほとんど問題になりません。 問題があるとすれば、数学では A = B となる関係が、Javaでは A ≒ B (ほとんど等しい)になりうる点です。
次のプログラムでは、1.0÷32.0×32.0 と 1.0÷49.0×49.0 を計算しています。 数学では両方とも 1.0 と等しいはずですが、Java では「ほとんど等しい」場合があります。
/* 1*/ class PrecisionTest { // 精度のテスト /* 2*/ public static void main (String[] args) { /* 3*/ System.out.println(1.0 / 32.0 * 32.0); // 数学的には1.0 /* 4*/ System.out.println(1.0 / 49.0 * 49.0); // 数学的には1.0 /* 5*/ } /* 6*/ }
24102a1:java1 k12x1001$ java PrecisionTest Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 1.0 0.9999999999999999 24102a1:java1 k12x1001$
前回は、変数に整数を格納しました。 変数に実数を格納することもできます。 整数と同様、変数を利用する前に、変数の宣言が必要です。 整数を格納すると宣言した変数を、 整数型 ( integer type )の変数と言い、実数を格納すると宣言した変数を、 実数型 ( real type )の変数と言います。 なお、実数型の変数に整数は格納できませんし、整数型の変数に実数は格納できません。
Javaでは、実数型の変数の宣言は、
int
の代わりに
double
を書きます。
なお、実数型という言葉はJavaにはありません。
Javaでは、
浮動小数点数型
(
floating point number type
)と言います。
次のプログラムは、変数を宣言し、実数を格納し、それを取り出しています。
/* 1*/ class DoubleTest { // 実数型の変数のテスト /* 2*/ public static void main (String[] args) { /* 3*/ double d; // 宣言文 /* 4*/ d = 1.23; // 代入文 /* 5*/ System.out.println(d); /* 6*/ } /* 7*/ }
24102a1:java1 k12x1001$ java DoubleTest Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 1.23 24102a1:java1 k12x1001$
実数型の変数に整数を格納するには、整数を実数に変換してから格納します。
実数に変換するには、
(double)
を左側に書きます。
式の場合は、混乱しないように適宜括弧を書いてください。
このような変換を、
キャスト
(
cast
)と言います。
次のプログラムでは、整数を実数にキャストして割り算を行っています。
/* 1*/ class CastTest { // キャストのテスト /* 2*/ public static void main (String[] args) { /* 3*/ int x = 7, y = 2; /* 4*/ double d, e; /* 5*/ System.out.println(x / y); // 7/2=3余り1 /* 6*/ d = (double) x; // 7を7.0に変換 /* 7*/ e = (double) y; // 2を2.0に変換 /* 8*/ System.out.println(d / e); // 7.0/2.0=3.5 /* 9*/ System.out.println(((double) x) / ((double) y)); // その場で変換 /* 10*/ } /* 11*/ }
24102a1:java1 k12x1001$ java CastTest Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 3 3.5 3.5 24102a1:java1 k12x1001$
整数型の変数に実数を格納するときも、実数を整数に変換します。
整数に変換するには、
(int)
を左側に書きます。
整数に変換する際に、小数点以下は切り捨てられます。
次のプログラムでは、実数を整数にキャストして割り算を行っています。
/* 1*/ class CastTest2 { // キャストのテスト2 /* 2*/ public static void main (String[] args) { /* 3*/ double d = 7.0, e = 2.0; /* 4*/ int x, y; /* 5*/ System.out.println(d / e); // 7.0/2.0=3.5 /* 6*/ x = (int) d; // 7.0を7に変換 /* 7*/ y = (int) e; // 2.0を2に変換 /* 8*/ System.out.println(x / y); // 7/2=3余り1 /* 9*/ System.out.println(((int) d) / ((int) e)); // その場で変換 /* 10*/ } /* 11*/ }
24102a1:java1 k12x1001$ java CastTest2 Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 3.5 3 3 24102a1:java1 k12x1001$
注意: 実数から整数へのキャストを忘れると、大抵エラーになりますが、整数から実数へのキャストを忘れても、自動的に変換される場合が多いです。
Javaには、数学的な定数と関数が用意されています。
これらには、
Math.
から始まる名前が付いています。
数学的な定数については、いくつかありますが、基本的なものは以下の通りです。
定数名 | 意味 |
---|---|
Math.PI
|
円周率 |
数学的な関数については、色々用意されていますが、基本的なものは以下の通りです。
関数名 | 意味 |
---|---|
Math.abs
|
絶対値 |
Math.floor
|
床関数 (それ以下の最大の整数) |
Math.ceil
|
天井関数 (それ以上の最小の整数) |
Math.rint
|
丸め関数 (最も近い整数。2つあるなら偶数のほう。) |
Math.sqrt
|
平方根 |
以下のプログラムでは、数学的な定数と関数を用いています。
/* 1*/ class MathematicsTest { // 数学的なテスト /* 2*/ public static void main (String[] args) { /* 3*/ System.out.println(Math.PI); // π /* 4*/ System.out.println(Math.abs(-0.1)); // -0.1の絶対値は0.1 /* 5*/ System.out.println(Math.floor(2.5)); // 2.5の床は2.0 /* 6*/ System.out.println(Math.ceil(2.5)); // 2.5の天井は3.0 /* 7*/ System.out.println(Math.rint(2.5)); // 2.5を丸めると2.0 /* 8*/ System.out.println(Math.sqrt(3.0)); // √3.0 /* 9*/ } /* 10*/ }
24102a1:java1 k12x1001$ java MathematicsTest Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 3.141592653589793 0.1 2.0 3.0 2.0 1.7320508075688772 24102a1:java1 k12x1001$
これまで、「ターミナル」にデータを出力するには、文
System.out.println(データ);
を使ってきました。
文字列をそのまま出力するには、「
データ
」の部分にその文字列をダブルクオート(
"
)で囲んで書き、変数の値を出力するには、そこにその変数名を書きました。
文
System.out.println(
データ
);
は、出力の後に改行します。
改行してほしくないときは、
System.out.print(データ);
と書きます。 また、改行だけしてほしいときは、
System.out.println();
とします。
javaコマンドでプログラムを実行している途中で、プログラムにデータを入力することができます。 次のプログラムは、入力された整数をそのまま出力するものです。
/* 1*/ import java.io.*; // データ入力のときに書く /* 2*/ /* 3*/ class InputTest { // データ入力のときに書く /* 4*/ public static void main (String[] args) throws IOException { // データ入力のときに書く /* 5*/ InputStreamReader isr = new InputStreamReader(System.in); // データ入力のときに書く /* 6*/ BufferedReader br = new BufferedReader(isr); // データ入力のときに書く /* 7*/ int x; /* 8*/ System.out.print("整数を入力してください: "); /* 9*/ x = Integer.parseInt(br.readLine()); // 入力 /* 10*/ System.out.print("整数は "); /* 11*/ System.out.print(x); /* 12*/ System.out.println(" です。"); /* 13*/ } /* 14*/ }
24102a1:java1 k12x1001$ java InputTest Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 整数を入力してください: 100 整数は 100 です。 24102a1:java1 k12x1001$
データ入力のあるプログラムでは、1行目から6行目まではそのまま書くものと考えてください。 ただし、3行目はファイル名によって変わります。
9行目の式
Integer.parseInt(br.readLine())
が入力される整数を表します。 プログラムの実行中にこの式があると、プログラムはいったん停止します。 「ターミナル」で整数を入力してreturnキーを押すと、入力した整数がこの式の値となり、プログラムは続行されます。
整数でなく実数を入力するには、
Integer.parseInt(br.readLine())
の代わりに
Double.parseDouble(br.readLine())
を書きます。
/* 1*/ import java.io.*; /* 2*/ /* 3*/ class DoubleInputTest { // 実数入力のテスト /* 4*/ public static void main (String[] args) throws IOException { /* 5*/ InputStreamReader isr = new InputStreamReader(System.in); /* 6*/ BufferedReader br = new BufferedReader(isr); /* 7*/ double d; /* 8*/ System.out.print("実数を入力してください: "); /* 9*/ d = Double.parseDouble(br.readLine()); // 入力 /* 10*/ System.out.print("実数は "); /* 11*/ System.out.print(d); /* 12*/ System.out.println(" です。"); /* 13*/ } /* 14*/ }
24102a1:java1 k12x1001$ java DoubleInputTest Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 実数を入力してください: 1.23 実数は 1.23 です。 24102a1:java1 k12x1001$
注意:
何も入力しないでreturnキーを押したり、整数や実数でないものを入力した場合、
Integer.parseInt
や
Double.parseDouble
の部分でエラーが発生します。
プログラムを中止したい場合は、controlキーを押しながらCキーを押します。
実数の使用例として、次の問題を考えます。
半径(radius)を入力して、円(circle)の面積(area)を出力する。
この問題を解決するには、上記の実数入力プログラムを元にして半径を入力し、公式「円の面積=半径×半径×円周率」を計算すればできます。
/* 1*/ import java.io.*; /* 2*/ /* 3*/ class CircleArea { // 円の面積 /* 4*/ public static void main (String[] args) throws IOException { /* 5*/ InputStreamReader isr = new InputStreamReader(System.in); /* 6*/ BufferedReader br = new BufferedReader(isr); /* 7*/ double radius, area; /* 8*/ System.out.print("半径を入力してください: "); /* 9*/ radius = Double.parseDouble(br.readLine()); /* 10*/ area = radius * radius * Math.PI; // 面積=半径×半径×円周率 /* 11*/ System.out.print("円の面積は "); /* 12*/ System.out.print(area); /* 13*/ System.out.println(" です。"); /* 14*/ } /* 15*/ }
24102a1:java1 k12x1001$ java CircleArea Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 半径を入力してください: 10.0 円の面積は 314.1592653589793 です。 24102a1:java1 k12x1001$
次の例も、公式を使う問題です。
距離(distance)と時間(time)を入力して、速度(velocity)を出力する。
この問題を解決するには、距離と時間を入力し、公式「速度=距離÷時間」を計算します。
/* 1*/ import java.io.*; /* 2*/ /* 3*/ class VelocityFormula { // 速度の公式 /* 4*/ public static void main (String[] args) throws IOException { /* 5*/ InputStreamReader isr = new InputStreamReader(System.in); /* 6*/ BufferedReader br = new BufferedReader(isr); /* 7*/ double distance, time, velocity; /* 8*/ System.out.print("距離を入力してください: "); /* 9*/ distance = Double.parseDouble(br.readLine()); /* 10*/ System.out.print("時間を入力してください: "); /* 11*/ time = Double.parseDouble(br.readLine()); /* 12*/ velocity = distance / time; // 速度=距離÷時間 /* 13*/ System.out.print("速度は "); /* 14*/ System.out.print(velocity); /* 15*/ System.out.println(" です。"); /* 16*/ } /* 17*/ }
24102a1:java1 k12x1001$ java VelocityFormula Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 距離を入力してください: 100.0 時間を入力してください: 2.5 速度は 40.0 です。 24102a1:java1 k12x1001$
次の問題を考えます。
底辺(base)と高さ(height)を入力して、三角形(triangle)の面積(area)を出力する。
この問題を解決するアルゴリズムを考え、プログラムを作成してください。 プログラムでは、変数を適切に利用してください。
24102a1:java1 k12x1001$ java TriangleArea Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 底辺を入力してください: 8.0 高さを入力してください: 2.5 三角形の面積は 10.0 です。 24102a1:java1 k12x1001$
余力のある人は、小学校、中学校で習った算数、数学、理科の公式を思い出し、同じような問題を自分で考え、答えを求めるプログラムを作成してください。 プログラムは、何を計算したかが分かるようにしてください。
今日の演習4の答案(Javaプログラム)をメールで提出してください。 差出人は学内のメール・アドレス(学生番号@cis.twcu.ac.jp)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(10月16日)を明記してください。