引き続き基本データ型の話になります。やっぱりプログラムは計算できなきゃね。まあショッピングサイトもニュース配信サイトも、難しい計算をするわけじゃない。でも基本は計算、読み書きそろばんは大事ですよ。
またぞろaとかbとか意味のない変数名を使って心苦しいのですが、例をシンプルにするためご勘弁願います。
1+1=田
「いち足すいちは?」「2」「残念でした、田んぼの田ですぅ」やりませんでした?
加減乗除は小学校でやったのと同じですが、掛け算の×は*(アスタリスク)、割り算の÷は/(斜線)になります。分数はありません。割り算で書き直してください。(小学校でやりましたよね)
int型どうしの演算は結果もint型になります。
double型同士の演算は結果もdouble型になります。
int型とdouble型の演算は、int型の値がdouble型に変換されてから演算が行われ、結果はdouble型になります。
int a = 2, b = 3, c; c = a + b;
cは5になります。おっとaやbのように、宣言のところで初期値を代入できます。次の図のようなイメージですね。
int a = 2; double b = 3, c; c = a - b;
cは-1.0になります。ここで注意してほしいのは、変数aの値がdoubleに変換されて減算に使用されるのであって、aの中身は2のままであるということです。またint型とdouble型は同じ-1でも記憶方法が違うので、intは-1、doubleは-1.0で説明することにします。
では除算。
double a = 5, b = 2, c;</pre> c = a / b;
cは2.5になります。
ついでにもうひとつ、除算のあまりを求める%の例も挙げておきましょう。
int a = 20, b = 7, c; c = a % b;
cには20÷7の余りの6が入ります。
5割る2は2?
次の結果はどうなるでしょう。
int a = 5, b = 2, c; c = a / b;
cには2が入ります。int同士の除算なので結果もintで求められるのですね。ではこれは?
int a = 5, b = 2; double c; c = a / b;
「2.5!」残念!2でした。doubleなので2.0としておきましょう。
こんなふうにint同士の除算では結果がintに変換されてから、左側の変数に代入されます。intに変換とは小数点以下切捨てなので、2.5が2になるわけです。代入先がdoubleでも小数点以下の情報は帰ってきません。
35打数11安打の野球選手の打率計算で、打数も安打数もintに入れて除算をすれば見事答えは0になってしまいます。気をつけましょう。
では変数cに2.5が入るようにするにはどうしたらいいのでしょうか。aかbをdoubleにするという手っ取り早い方法があります。
int a = 5; double b = 2, c; c = a / b;
ここまでくれば野球好きの方は、打率の計算や防御率の計算のプログラムを作ってみてもいいですね。お好きな選手の現在のデータを初期値で入れてやってみてください。くれぐれもint同士の除算に気をつけて。
四捨五入して20歳よ!
タイトルのようなせりふを言えたのも遠い遠い昔...それはさておき、世の中、四捨五入や切捨てはたくさん使われています。お金の計算でも、消費税が絡んでくるとどうしても小数点以下をどう処理するかが問題になってきます。
まずは切捨てから。double型の値をint型に代入すれば無条件に小数点以下を切り捨ててくれそうですね。
double a = 12.34; int b = a;
これはいけません。「doubleでせっかく小数点以下を情報として持っていたのに、あなたはその大事な情報を切って捨てていますよ!」と親切なjavaのコンパイラが教えてくれます。そこで「私は重々承知の上で、その大事な情報を切って捨てたいのです。」ということを示すために、代入前にaの値をintに変換しておきます。こう書きます。
int b = (int)a;
これでめでたくbには12が入るというわけです。
ついでに逆の場合もやっておきましょう。
int a = 12; double b = a;
これはOKです。別にこの代入によって貴重な情報はなくならないので、問題ありません。もちろん
double b = (double)a;
としてもかまいません。
四捨五入はこうやります。
double a = 12.67; long b = Math.round(a);
Math.round()はクラスMathの中のメソッドroundという意味です。詳しくはおいおいわかると思いますので、ここではこのまま覚えてください。結果はlongです。もし結果をint型に代入したければ、変換が必要です。
int b = (int)Math.round(a);
切り上げはこうやります。結果がdoubleになることに注意。
double a = 12.67; double b = Math.ceil(a);
aには13.0が入ります。気をつけてほしいのは負の値の場合です。
double a = -12.67; double b = Math.ceil(a);
bには-13.0ではなく-12.0が入ります。つまりaの値以上で一番近い整数値をdoubleで求めているのです。
Mathクラスには他にもべき乗や三角関数など、懐かしき高校数学の関数も用意されていますが、あまり使わないかなと思うので、いざ必要になったら調べてください。
こりゃ便利、でも必要?
変数xの値を1増やすにはこうします。
x = x + 1;
xが10の場合、=の右の式の値は11になり、これがxに代入されるので、変数xの新しい値になります。これをこう書くこともできます。
x++;
または
++x;
もう見当がついたでしょうか。
x = x - 1;
は
x--;
または
--x;
です。++や–がxの前につくか後ろにつくかの違いはすぐに説明します。ちなみにx**やx//はありません。
今度は変数xの値を5増やしてみましょう。
x = x + 5;
これはこう書けます。
x += 5;
+が-や*/になっても同じです。
x -= 5;
x *= 5;
x /=5;
という具合です。
まあ変数名がxなどというシンプルなものでなく、とんでもなく長い名前で2度書くのは面倒という場合以外は余り使わなくてもすむかな、という感じです。
どっちが先?
a+bとc-dの掛けた値をeに代入したい場合
e = a + b * c - d;
では間違えです。算数で習ったのと同じ、+や-より*や/の方が優先されます。この場合b*cが先に計算されてしまいます。括弧を使うのも算数と同じ。
e = (a + b) * (c - d);
では次の二つの場合、aやbの値はどうなるでしょうか。
int a = 10, b; b = a++;
と
int a = 10, b; b = ++a;
そう、++の位置が違うだけです。まず最初のa++の方は
int a = 10, b; b = a; a = a + 1;
と書き換えられます。aは11、bは10になります。次の++aの方は
int a = 10, b; a = a + 1; b = a;
となり、aもbも11になります。でもこんな微妙な使い方でバグになるのもいやなので、b=a++;のような書き方はあまりしないでしょう。(知っていると、物知り博士といわれたり、認定試験で1問得したりするでしょう。)
次もaやbに何が代入されるか考えてみてください。
int a, b, c = 3; a = b = c;
そう、aもbも3になります。普通、式は左から右へ計算して行きますが、代入については右から左に行われます。つまり括弧を使うと
a = (b = c);
と同じです。実はb=cも値を持っていて、bに代入された値になります。そこでaにb=cの値3が代入されるというわけです。これも
b = c; a = b;
とすれば同じです。
わかりにくい式は括弧で計算の順序をはっきり示しましょう。凝った式は書かず、いくつかの文に分けて書きましょう。