未来エンジニア養成所Blog

月単価180万以上のプログラミング講師がプログラミングを皆に楽しんでもらうための情報をお届けします。

【Java】計算してみよう

title

Javaプログラムで計算をする方法を解説します。

変数を使用しますので「変数って何?」という人は、以下の記事を先に読んで理解しておいてくださいね。

phoeducation.work

phoeducation.work


整数の計算

整数型(byte, short, int, long)の変数、および定数に対して行える演算については以下になります。


四則演算

四則演算とは足し算、引き算、掛け算、割り算です。


Javaではこの四則演算の他に、割り算の余りを計算することができます。

表記 計算の意味 使用例 結果
+ + (足し算) a = 1 + 2 3
- - (引き算) s = 4 - 1 3
* × (掛け算) t = 2 * 3 6
/ ÷ (割り算) d = 5 / 2 2
% 余り m = 7 % 3 1


ポイント!

上表の割り算の例を見てください。5/2 が 2 になっています。

「5/2 は 2.5 では?」と思われるでしょう。


Javaで演算を行う時は、データ型も演算を行う際に利用されています。

5/2 をデータ型だけで見た場合、int型 / int型となります。

よって結果もint型としか得られないので、小数点の情報は切り捨てられます。

小数点以下の数値が欲しい場合は、演算の式にfloat型かdouble型の数値が利用されている必要があります。

5.0/2 でもOKです。


【四則演算】

public class Calc{
    public static void main(String[ ] args){
        int x = 25;
        int y = 10;

        System.out.println("x + y = " + (x + y));
        System.out.println("x - y = " + (x - y));
        System.out.println("x * y = " + (x * y));
        System.out.println("x / y = " + (x / y));
        System.out.println("x % y = " + (x % y));
    }
}


実行結果

x + y = 35
x - y = 15
x * y = 250
x / y = 2
x % y = 5


[動画解説]
vimeo.com


インクリメント・デクリメント

プログラミングにおいて変数の値を1ずつ増やしたり、減らしたりする処理は頻繁に行なわれます。

このため、Javaでは変数の値を1つ増やす処理や、減らす処理を特別な演算子で実行することができます。


この処理を「インクリメント」(値を1つ増やす)、および「デクリメント」(値を1つ減らす)といいます。

インクリメントはインクリメント演算子(++)、デクリメントはデクリメント演算子(--)で行います。

演算子 使用方法 意味
++ a++または++a a = a + 1
-- b--または--b b = b - 1


【インクリメントとデクリメント】

public class Inc{
    public static void main(String[ ] args){
        int a = 10;
        a++;
        System.out.println("a = " + a);
        a--;
        System.out.println("a = " + a);
    }
}


実行結果

a = 11;
a = 10;


[動画解説]
vimeo.com


インクリメント、デクリメントの記述位置

インクリメント演算子、デクリメント演算子は、対象となる変数の前につけるのか、後ろにつけるのかによってインクリメント、デクリメントされる処理の順番が変わります。

前につけることを「前置」、後ろにつけることを「後置」と呼びます。


前置のインクリメント、デクリメント

対象の前につけた場合は、他の処理よりも先にインクリメント、デクリメントを行った後、その他の処理が行われます。

c = ++a;


後置のインクリメント、デクリメント

対象の後ろにつけた場合は、まず他の処理を行ったのち最後にインクリメント、デクリメントを行います。

c = a++;

変数aの値を変数cに代入してから、変数aの値を1増加させます。

このように演算子を変数の前後のどちらに配置するかによってその行の結果が変わってきますので注意が必要です。


【インクリメントの前置と後置】

public class Inc2{
    public static void main(String[ ] args){
        int a = 10;
        System.out.println("a = " + a );
        System.out.println("a++ = " + a++);
        System.out.println("a = " + a);
        System.out.println("++a = " + ++a);
        System.out.println("a = " + a);
    }
}


実行結果

a = 10
a++ = 10
a = 11
++a = 12
a = 12


[動画解説]
vimeo.com


代入演算子

数学において「=」は、等しいことを表しますが、Javaでは右辺の値を左辺に代入するということを表します。

変数 = 数値;


例えば、次の1行は変数aに数値5を代入しています。

a = 5;

「=」の右辺には、式(複数の値の演算など)を置くことができますが、左辺には1つの値しか置くことができません。


以下のように記述することが可能です。

int a, b = 11;
a = 10 + 5 * b;


変数aが「=」の左辺と右辺の両方に登場してもかまいません。

a = a + 5;


このような演算は数学的にみればおかしい事ですが、Javaの世界ではまったく問題がありません。


「=」の両辺に同じ変数があったとしても、処理を行う際は右辺だけが注目されます。

そして右辺の処理の結果を左辺に代入を行います。


「=」の右辺の値を左辺に代入するという処理だけに注目すれば理解しやすいのではないでしょうか。


様々な代入演算子

Javaでは下表の演算子を利用する事が出来ます。

演算子 使用例 意味
= a = b aにbを代入
+= a += 3 a = a + 3
-= b -= 2 b = b - 2
*= c *= 4 c = c * 4
/= d /= 5 d = d / 5


演算と代入を同時に行う場合には式を簡略化することができます。


「a = a + 5;」のプログラムのコードは「a += 5;」のように書いても同じ意味になります。


これらは演算すると同時に結果を左辺に代入するという働きをもちます。


代入演算子

public class Calc2{
    public static void main(String[ ] args){
        int a = 10, b = 2;
        System.out.println("代入演算子実行前:a = " + a + ", b = " + b);
        a += 5;
        b *= 3;
        System.out.println("代入演算子実行後:a = " + a + ", b = " + b);
    }
}

実行結果

演算子実行前:a = 10, b = 2
演算子実行後:a = 15, b = 6


ポイント! オペランド

今まで足し算を実行する”+”記号や、”*=”等の代入演算子を見ていきました。

Javaではこのように数値の計算や変数に代入するなど、何らかの操作を表す記号を”オペレータ”と呼びます。

これに対して、”a += 4”において操作の対象となる変数aや、数値4などは”オペランド”と呼びます。


[動画解説]
vimeo.com


浮動小数点の計算

基本データ型の中には小数を扱うデータ型があります。float型とdouble型です。


データ型って何だっけ?と言う人は下記を見てくださいね。

phoeducation.work


コンピュータの世界では、小数を浮動小数という表現で扱いますが、内部的なものなので、はじめのうちは通常の小数と考えてしまって良いでしょう。


基本的な計算の方法は整数と同じになります。


【小数を扱う(float型・double型)】

public class FloatDoubleCalc{
    public static void main(String[ ] args){
        float f = 1 / 9.0f;
        double d = 1 / 9.0;
        System.out.println("float  : " + f);
        System.out.println("double : " + d);
    }
}


実行結果

float  : 0.11111111
double : 0.1111111111111111


[動画解説]
vimeo.com


小数を扱う際の注意点

小数を扱う際には、整数よりも注意して扱う必要があります。


float型への定数の代入

プログラムソース上に小数点数を記述した場合はdouble型の値として処理されます。

よってfloat型の変数には直接入れる事が出来ません。


float型にdouble型の数値を入れるには、double型をfloat型に変換する必要がありますが、それには2通りの方法があります。


1つ目が数字の後ろに「f」を記述する方法です。

float f = 3.14f;


しかしこれはリテラルにしか利用できません。

double型の変数の値を変換するには利用できません。


変数の後ろに f をつけると違う変数名と判断されてしまうからです。


このときには2つ目の方法を利用します。

それは「キャスト」です。


キャストとはあるデータ型を違うデータ型に変換する事です。


double型をfloat型やint型に、int型をbyte型などに変換を行う事が出来ます。


キャスト

プログラムの中でint型の数値をdouble型の浮動小数点にしたい、またその逆のパターンを行いたい場合があるかもしれません。


キャストとはこのようにJavaプログラムの中で必要に応じて変数や定数のデータ型を変換する事を言います。


キャストを行う際には、プログラムコードとしてコード中にキャストの構文を記述しなければならない時(縮小変換)と、記述しなくても良い時(拡張変換)があります。


記述しない場合はJavaVMがそのときのプログラム内容によって変換すべき型に自動で変換しています。


キャストの書式は以下の通りです。


書式 : (変換後のデータ型)変換する値や変数;

[例文]
(int)10.2 : float型をint型に変換
(int)'A' : 文字'A'をint型に変換
(float)a : 変数aの値をflaot型に変換


キャストは「その時だけ」型を変換します。


あるfloat型のデータ(Aとします)をint型にキャストを行ったとしても、それ以降でのデータAはfloat型のままです。


キャストには大きく分けて2種類あります。

  • より大きく、より細かく表すことができる型に変換する (拡張変換)
  • 大きな情報を小さな情報に、細かなものを荒いものに変換する (縮小変換)

拡張変換の場合はキャスト構文を記述するかは任意ですが、縮小変換の場合はキャスト構文を記述しないとコンパイルできません。記述しなかった場合はコンパイルエラーとなります。


拡張変換

int型のデータをlong型やfloat型、float型をdouble型に変換する事を「拡張変換」といいます。

これはデータサイズが小さいものから大きいものへ変換する事です。


なおデータサイズが同じintとfloat、longとdouble型ですが、intからfloat、longからdoubleへは拡張変換、その逆のfloatからint、doubleからlongへは「縮小変換」になります。


縮小変換

long型のデータをint型やshort型、double型をfloat型やlong型及びint型に変換することを「縮小変換」といいます。

これはデータサイズが大きいものから小さいものへ変換する事です。


縮小変換を行った場合、問題が発生する事があります。

データサイズが小さくなるため、データの一部が失われてしまう可能性があるのです。


現実世界に例えると、大きな箱の中身を小さな箱に移し変えた場合、箱が小さくなったので全て箱に入りきらない事と同じです。


データが一部失われる事で、そのデータは元のデータとはまったく違うデータを表現するようになる場合もあります。


キャストが必要なときと必要ないとき

下図の、矢印で辿って行ける型へのキャストは自動的に行えますが(拡張変換)、これ以外の場合は明示的にキャストする必要があります(縮小変換)。


例えば、byte型からfloat型へのキャストは自動的に行えますが、float型からlong型へはキャストが必要です。

キャスト


【キャスト】

public class Cast{
    public static void main(String[ ] args){
        float f = 3.14f;
        double d = f;          //拡張変換
        int i = (int)d;        //縮小変換
        System.out.println("float  : " + f);
        System.out.println("double : " + d);
        System.out.println("int    : " + i);
    }
}


実行結果

float  : 3.14
double : 3.140000104904175
int    : 3


縮小変換ではデータの一部が失われる可能性があります。これを「桁落ち」といいます。


実数から整数に変換すれば、小数部は切り捨てられます。


元の値の大きさがキャストを行うデータ型の最大値(もしくは最小値)を超えているときには、正しい変換はできません。


[動画解説]
vimeo.com


演算結果とキャスト

public class Cast2{
    public static void main(String[ ] args){
        int a = 5, b = 2;
        System.out.println("キャスト無しで演算 : a / b = " + (a / b));
        System.out.println("キャスト有りで演算 : a / b = " + ((float)a / (float)b));
    }
}


実行結果

キャスト無しで演算 : a / b = 2
キャスト有りで演算 : a / b = 2.5


[動画解説]
vimeo.com


ポイント! char型と数値について

文字が文字コードと呼ばれる数値でコンピュータ内に管理されています。

コンピュータは、文字について文字として表現した情報と、その文字を文字コードによって数字で表現した情報を認識しています。


よって、文字をプログラム内で利用する際には、通常は文字を文字として表示しますが、文字を数字として表示(利用)する事も可能です。

その際表示される数字はUnicodeでの番号になります。


文字を数字として表現するには、文字を数値型にキャストします。


【文字を数値として表現する】

public class CharIntTest{
    public static void main(String[ ] args){
        System.out.println('A');
        System.out.println((int)'A');
        System.out.println((int)'A' + 1);
        System.out.println((char)((int)'A' + 1));
        System.out.println('A' + 1);
    }
}


実行結果

A
65
65
B
66


3行目は、文字を文字として表示します。


4行目は、文字を数字として表示します。

65はAをUnicodeで表した番号です。


5行目は、文字を数字にキャストを行い、1を加算し表示します。

65 + 1 で66です。


6行目は、文字を数字にキャストを行い、1を加算し、再び文字へキャストを行い表示します。

BはUnicodeでの66番の文字です。


7行目は、文字に直接1を加算しています。

文字Aが自動でキャストされています。よって65 + 1で66です。


[動画解説]
vimeo.com


まとめ

整数の計算

プログラムの世界でも現実と同じく四則演算が使えます。


インクリメント、デクリメント

Javaには変数を1つだけ増加させる、1つだけ減算するという場合に使うインクリメント、デクリメント演算子があります。


代入演算子

代入は右辺から左辺への代入となります。代入演算子には”=”による代入だけではなく、代入と同時に演算を行えるものもあります。


浮動小数点

プログラムで小数を扱う場合には、float型やdouble型といった小数専用の変数を使う必要があります。


キャスト

キャストとは、データ型を一時的に変換するためのものです。キャストは主に縮小変換が必要なときに利用します。



独学で挫折しそうになったら、オンラインプログラミングスクール
未来エンジニア養成所Logo



あわせて学習したい

phoeducation.work phoeducation.work