2-1-3 整数の割り算と剰余

2-1-3 整数の割り算と剰余

コンピュータが計算処理を行う時には整数と小数を厳密に区別していますが、次のように割り切れない整数での割り算はどのような結果を返すでしょうか?

println(5 / 2);

コンピュータは計算結果を「2」と表示します。
人間であれば、自然と小数に変換して「2.5」と答えたり、分数を使って「5/2(5分の2)」と答えたりするでしょう。人間であれば適切な形へ変換する柔軟な判断ができるのですが、プログラム(コンピュータ)は小数への変換や分数を原則としては自動変換しません。
これは一見すると不便なようにも思えます。プログラミング言語によっては、ある程度の自動変換を行うものもあります。しかし、特に慣れないうちは自動変換がプログラマーの意図した変換でない場合がある為、自動変換は便利ですが混乱を生じます。5÷2という計算をコンピュータにやらせる事は出来ますが、5ドルで2ドルの商品が幾つか買えるのか(期待する答えは2個)、5個のりんごを2人で分けるとき何個づつになるのか(期待する答えはのは2.5)という計算式が求められている条件はコンピュータは判断できないのです。

プログラミング言語は、この自動変換という視点で分類すると、自動変換を多用する事で便利に簡単に記述できる言語と自動変換は確実に行える時以外では行わず厳密に記述しなくてはならない言語に分類できます*1Javaは後者の特色が強い言語であり、型付けが強い言語と呼ばれています。
とは簡単に言えばデータの種類の事です。つまり、1と書けば整数型であり、1.0と書けば小数型とJavaでは判断されるわけです。従って、5 / 2は整数での割り算を行っているので、その結果も整数となります。この時、割り切れない端数に関しては切り捨てが行われると定められています。

しかし、これでは割り切れたのか端数が発生しているのかをプログラム上で判断できません。例えば、ある数が偶数か基数かを判断する状況においては2で割り切れるかどうかが重要であるように、端数の方が商よりも重要なシチュエーションもあります。このような割り算の余りを求めたい場合には、剰余演算子「%」を使う事ができます。剰余と聞くと聞きなれない単語ですが、要するに割り算の余りです。小数も分数も学習していない小学生の頃、「5÷2 = 2 余り1」と考えた事を思い出してください。
5÷2 の結果と剰余(余り)を表示するのであれば、次のようになります。

println(5 / 2);
println(5 % 2);

2回計算を行っているようで効率が悪いと考えてしまうかもしれませんが、コンピュータの演算能力は予想を超えるほど早いのですから、気にしないでください。

尚、整数の割り算が切り捨てである理由はコンピュータ内部での演算の仕組みが切り捨てる方が都合がいいからです。また、切り上げを行いたい場合は計算式にちょっとした細工を行う事で簡単に実現する事ができます。5÷2を切り上げで計算したい場合は次のように書けます。

println((5 + 2 - 1) / 2);

割られる数(5)に割る数(2)を足して1を引いています。この数に対して割り算を行えば、切り上げとして扱う事ができます。理由がピンと来ない人は余りがどのように変わるかを書いてみましょう。

練習問題
  1. 342分は何時間と何分であるかを表示するプログラムを作成しなさい。ただし、1行目に時間を2行目に分を表示する事。
  2. 生まれてから646488971秒が経過している人が何歳であるかを計算して表示するプログラムを作成しなさい。尚、1年は365日として考えて閏年は考慮しなくて良い。

*1:完全に2分できるというわけではなく間にあるような言語もあります。