Ruby on Railsで割り算をしよう!商と余りの求め方

2019年1月6日日曜日

Ruby on Rails

Ruby on Railsで割り算

今日はRuby on Railsでの、割り算の方法を見てみましょう。

Ruby on Railsで割り算を行うときは、

商は  「/」記号
余りは 「%」記号

で求めることができます。

しかし、それ以外にもいくつかやり方があるので、具体例を見ながら、Ruby on Rails上での割り算の方法を見てみましょう。


Ruby on Railsで割り算をしよう!商と余りの求め方

Ruby on Railsで割り算をしよう!商と余りの求め方

割り算の商と余りを求めるメソッド一覧


詳細な動きの説明をする前に、まずは余りを求めるメソッドの一覧を、それぞれ見てみましょう。

メソッド 戻り値の型
/ 整数 or 浮動小数点数
div 整数
quo 分数

余り

メソッド 戻り値の型
% 整数
modulo 整数
remainder 整数


商と余りを同時に求める

メソッド 戻り値の型
divmod 配列 [整数, 整数]


デモンストレーション


まずは上記の全てのメソッドを、Ruby on Rails上で動かしてみます。

con1というコントローラーに、act1というアクションを作って、動作確認をしてみましょう。

以下が今回利用するコントローラーのファイルです。
下記のコントローラーでは、「13 ÷ 5」の商と余りを、様々なメソッドを使って求め、それぞれの値をインスタンス変数に格納しています。


exampleAPP/app/controllers/con1_controller.rb
class Con1Controller < ApplicationController

  def act1
    #「13 ÷ 5」の商と余りを求める例

    #商
    @div1 = 13 / 5
    @div2 = 13.div(5)
    @div3 = 13.quo(5)

    #余り
    @mod1 = 13 % 5
    @mod2 = 13.modulo(5)
    @mod3 = 13.remainder(5)

    #商とあまりを同時に求める
    @divmod1 = 13.divmod(5)

  end
end

Ruby on Railsではコントローラークラスにおけるインスタンス変数を、ビューからも参照できますから、これらの割り算の結果は、HTMLテンプレートに埋め込むことができます。

コントローラーとビューの関係の理解がイマイチ… という方は、以下をご参照ください:
コントローラーとビューの関係【Ruby on Rails超入門】>>



Ruby on Railsから計算結果を表示するために、今回の例で用いるビューは、以下のものです。

exampleAPP/app/views/con1/act1.html.erb
<h2>商</h2>
@div1 = 13 / 5   <br />
@div1: <%= @div1 %>   <br />
  <br />
@div2 = 13.div(5)   <br />
@div2: <%= @div2 %>   <br />
  <br />
@div3 = 13.quo(5)   <br />
@div3: <%= @div3 %>   <br />
  <br />
<h2>余り</h2>
@mod1 = 13 % 5   <br />
@mod1: <%= @mod1 %>   <br />
   <br />
@mod2 = 13.modulo(5)   <br />
@mod2: <%= @mod2 %>   <br />
   <br />
@mod3 = 13.remainder(5)   <br />
@mod3: <%= @mod3 %>   <br />
   <br />
<h2>商とあまりを同時に</h2>
@divmod1 = 13.divmod(5)   <br />
@divmod1: <%= @divmod1 %>   <br />
商:<%= @divmod1[0] %>   <br />
余り:<%= @divmod1[1] %>

上記のビューとコントローラーからの出力結果を、ブラウザから確認してみましょう。

WebブラウザーからURLを入力すると、以下のような画面が表示されます。

Ruby on Railsでの割り算実行結果

実行結果は上記のようになります。

以下では、これらのメソッドの詳しい使い方を見ていきましょう。


各メソッドの詳細


割り算の商:
「/」メソッド


まずは、「/」メソッドの使い方を見ていきましょう。

上記の例の実行結果だと、以下の部分ですね。
@div1 = 13 / 5
@div1: 2

/」はRubyやRuby on Railsに限らず、多くのプログラミング言語で割り算を意味しますから、親しみやすいですね。

上記の「整数 / 整数」の例では、小数点以下が切り捨てられた、整数値が返ってきています。

この「/」メソッドを使う上での注意点としては、
「割る数と割られる数のどちらかに小数を含むと、商も小数になる」
ということです。

以下の実行結果をご覧いただくと、分かりやすいでしょうか。

@div1 = 13 / 5
@div1: 2

@div2 = 13.0 / 5
@div2: 2.6

@div3 = 13 / 5.0
@div3: 2.6

@div4 = 13.0 / 5.0
@div4: 2.6

「13 / 5」という整数同士の割り算では、整数の商が得られるのに対して、
どちらかに小数点が付いている場合は、2.6という小数の商が返ってきます。

実行の際には、どの程度の精度で商を得たいのかを意識しながら用いる必要があるメソッドですね。


割り算の商:
divメソッド


上記の例の実行結果だと、以下の部分ですね。
@div2 = 13.div(5)
@div2: 2

divメソッドの場合は、いかなる場合も小数点以下は切り捨てとなりますので、この場合の商は、2となります。

@div1 = 13.div(5)
@div1: 2

@div2 = 13.0.div(5)
@div2: 2

@div3 = 13.div(5.0)
@div3: 2

@div4 = 13.0.div(5.0)
@div4: 2

上記のように、割る数、割られる数の小数部の有無に関わらず、一律に小数を切り捨てた値が返ってきていますね。


割り算の商:
quoメソッド


上記の例の実行結果だと、以下の部分ですね。
@div3 = 13.quo(5)
@div3: 13/5

Ruby on Railsにおけるquoメソッドは、分数で値を返します。
上記の例では、分数で表示が行われていますが、フォーマットを指定して表示すれば、小数での表示も可能です。

切り捨てを行わず、厳密な商を求めたい場合は、このquoメソッドを用いると良いでしょう。


割り算の余り:
「%」メソッド


上記の例の実行結果だと、以下の部分ですね。
@mod1 = 13 % 5
@mod1: 3

%」は、割り算の余りを求めるメソッド・算術演算子として、多くのプログラミング言語で採用されています。

余りは整数しかありえませんから、戻り値はもちろん整数になります。


割り算の余り:
moduloメソッド


上記の例の実行結果だと、以下の部分ですね。
@mod2 = 13.modulo(5)
@mod2: 3

このmoduloメソッドは、上記の「%」メソッドと全く同じ動きをします。

しかし、負の数を扱う場合に、下記のremainderメソッドと違う動きをするので注意が必要です。

試しに下記の例を見てみましょう。
@div1 = 13.modulo(5)
@div1: 3

@div2 = 13.modulo(-5)
@div2: -2

@div3 = (-13).modulo(5)
@div3: 2

@div4 = (-13).modulo(-5)
@div4: -3

動作としては、以下のようになります。

余りの符号:
 ⇒ 割る数と同じ符号になる

余りの絶対値:
 ・割る数と割られる数が同じ符号
  ⇒ 正の数同士の割り算の余り
 ・割る数と割られる数が違う符号
  ⇒ |正の数同士の割り算の余り - 割る数|


何故こんなにややこしい事になるのかというと、割り算の余りの求め方には、以下の2通りの方法があるからなのです。

  • 13 ÷ 5 = 2  余り 3
  • 13 ÷ 5 = 3  余り -2

ここに正負の数まで絡んでくると、上記のようなややこしい挙動になってしまうのですね。

以下でご紹介するremainderメソッドの挙動は、もう少し分かりやすいと思います。


割り算の余り:
remainderメソッド


上記の例の実行結果だと、以下の部分ですね。
@mod3 = 13.remainder(5)
@mod3: 3

こちらも余りを求めるメソッドなので、整数の結果が返ってきます。

上記のdivメソッドとは、正負の割り算の動きが異なるのですが、おそらくこのremainderメソッドの方が分かりやすいでしょう。

remainderメソッドを用いた正負の割り算は、以下のようになります。
@mod1 = 13.remainder(5)
@mod1: 3

@mod2 = 13.remainder(-5)
@mod2: 3

@mod3 = (-13).remainder(5)
@mod3: -3

@mod4 = (-13).remainder(-5)
@mod4: -3


余りの符号:
 ⇒ 割られる数と同じ符号になる

余りの絶対値:
 ⇒ 正の数同士の割り算の余り

余りの絶対値は、正の数同士の割り算の余りと同じですから、問題ないでしょう。
符号に関しても、「割られる数と同じ」と覚えて頂ければ、大丈夫です。

つまり結局のところ、remainderメソッドにおける余りを求める計算において、割る数の符号は、計算結果には関係ないのですね。


割り算の商と余りを同時に:
divmodメソッド


上記の例の実行結果だと、以下の部分ですね。
@divmod1 = 13.divmod(5)
@divmod1: [2, 3]

こちらに関しては、割り算の余りが同時に求められるので、戻り値が配列で返されます。

配列の内容は、
[, 余り]
となっています。

それぞれの値を取り出したい時には、通常の配列と同様に、以下のように記載すれば配列内の値を取り出すことができます。

exampleAPP/app/views/con1/act1.html.erb
商:<%= @divmod1[0] %>   <br />
余り:<%= @divmod1[1] %>

上記のビューをWebブラウザーから確認すると、以下のようになります。
Ruby on Railsでの割り算の商と余り

返される値としては、商は「divメソッド」、余りは「moduloメソッド」を実行した結果と同様になります。


まとめ:
Ruby on Railsでの割り算を使いこなそう!

Ruby on Railsでの割り算を使いこなそう!

如何でしたでしょうか?

Ruby on Railsでの割り算の方法について、概要を理解して頂けたでしょうか。


算術演算は、プログラミングにおいて非常に基本的な処理ですが、小数点や、正負の数のことまで考慮すると、中々ややこしい部分がありますね。

しかし、システム上でお金の計算をするケース等も考えると、ここを適当にやってしまうと、大きなトラブルにも発展しかねない、重要な部分です。

是非Ruby on Railsでの割り算を使いこなして、正確で、便利なシステムを作りたいものですね。

その他、Ruby on Railsのメリットやデメリットについて、より深く知りたい方は、以下の記事もご参照ください。
Ruby on Railsのメリット・デメリット【初心者にもわかりやすく解説】>>