【Ruby初心者入門説明書】数値と四則計算について解説
足す、引く、掛ける、割るといった4つの計算の基本である四則計算は、小学生で習う基本です。
そのため、Rubyをはじめとしたプログラムを学習する人の多くも、特に調べることなく使うことができます。
しかし、大きな数や小さな数を扱う場合など、学校で習うことのない決まりがあるのです。
ここでは、そんな四則計算や数値をRubyで扱う場合について、詳しく解説していきます。
Rubyで計算するのは簡単
プログラムではいろいろな計算を行いますが、科学計算や数学の難題のような計算を行うことは稀です。
ここでは、そんな「日常生活でも普通に使っている」計算をRubyでどう表現するのかを紹介していきます。
演算子
四則計算を含めて、計算式を表現するには、演算記号(一般的に演算子と呼びます)が必要です。 一般的には、「足し算は+」「引き算は-」「かけ算は×」「割り算は÷」「等しいは=」です。 Rubyで計算するときも、ほぼ同じ記号を使っていますが、じつは意味が違っていたり、違う記号を使っていたりする場合もありますので、注意しなければいけません。 以下が、Rubyの演算子(数値計算で使うものを代数演算子、代入に使うものは代入演算子と呼びます)です。 ※aとb、cはある数値もしくは変数
+ | 正の数を表す(+a) 加算を表す(a+b) |
---|---|
– | 負の数を表す(-a) 減算を表す(a-b) |
* | 乗算を表す(a*b : a × b) |
/ | 除算の商を表す(a/b : a ÷ b) |
% | 整数の除算の余りを表す(a%b : a割るbの余り) |
** | 累乗を表す(a**b : aのb乗) |
= | 代入を表す(a = b + c : 変数aにb + cの結果を格納する) |
+= | 自己代入を表す(a += b : a = a + b) +以外の演算子でも可能 |
四則計算だけじゃない
単純な計算であれば、上述の演算子を使えば簡単に計算式を表現できます。しかし、複雑な計算や大きな数を扱う場合は、もう少し憶えておいた方が良いことがあります。
計算の優先度
いくつもの演算子を駆使した計算式の場合、演算子の優先度を考慮した書き方をしなければ、正しい結果は得られません。 Rubyの演算子にも、一般的な計算の場合と同様に、以下のような計算(演算子が処理する)の優先度が決まっています。
※同じ優先度の場合は、最初に現れた演算子から処理する。 また、この優先度通りでは困る場合は、()で囲むことで、()内の計算を前に行うのは、通常の計算と同じです。 確認するため、以下のプログラムを動かしてみましょう。
# 計算式
a = 1.0 + 3.0 / 3.0
b = (1.0 + 3.0) / 3.0
# 結果表示
print(“aは、”, a,”\n”)
print(“bは、”, b,”\n”)
数値の区切り
経理や事務の人であれば、特になじみがあるかもしれませんが、大きな数値を書くとき、以下のように桁を表す「,」を挿入する場合があります。
残念ながら、Rubyではこの表現ができません(「,」に別の意味があるため)。
そのため、Rubyで大きな桁の数を表現するとき、「,」の代わりに「_」を使うことができます。
ただし、これはあくまでも表記上の話で、プログラムは「_」なしの数値として認識しますので、プログラムからの出力には「_」は含まれていませんので、注意してください。
a = 123456
puts(a)
a = 123_456
puts(a)
123456
123456
[/bash]
計算するときの注意点
ここまでの説明を踏まえて、「分」から「時間」に変換するプログラムを作成してみましょう。
in_minuts = 90 # 時間に変換したい分
out_hour = 0 # 変換した時間部分
out_minuts = 0 # 変換した分部分
out_hour = in_minuts / 60 # 時間をとるため、60で割った商を得る……(1)
out_minutes = (in_minuts % 60) / 60 # 余りの分を時間に変換する……(2)
print(out_hour + out_minutes) # 変換結果
まず、プログラムを動かす前に、どんな結果になるかを予測してみましょう。
最初の1行は、変換すべき分を設定しています。
2〜3行めは、変換した後の結果を入れる箱です。
変換処理はその後の2行です。この部分について、結果を予測してください。
頭の中では、以下のような結果を予測するのではないでしょうか?
[bash]1.5
[/bash]
では、実行してみましょう。
[bash]1
[/bash]
なぜ、予測と違っているのかを説明していきましょう。
小数について
ポイントは割り算です。 割り算は、(1)、(2)ともに実施しています。 じつは、この割り算が、両方とも小数点以下切り捨てされた結果となっているのです。 これはRubyの数値の扱い方に起因します。 Rubyが変数に数値を格納されたとき、その数値が整数なら、その変数には整数しか入らなくなるのです。 そのため、(1)の割り算(90÷60)の結果は1、(2)の割り算(30÷60)の結果が0となって、上述のような出力となるのです。 これは、Rubyで数値を扱う上で間違えやすい点ですので、注意しましょう。
小数を小数として扱わせる
Rubyに小数を扱わせるもっともシンプルな解決方法を説明しましょう。 それは、最初の初期化の段階で、小数を格納することです。 そうすれば、その変数は小数が格納されるものになりますので、計算結果も小数になることでしょう。 しかし、ここには落とし穴があります。 まずは、プログラムを改造して動作を確認してみましょう。
in_minuts = 90.0 # 時間に変換したい分
out_hour = 0.0 # 変換した時間部分
out_minuts = 0.0 # 変換した分部分
out_hour = in_minuts / 60 # 時間をとるため、60で割った商を得る……(1)
out_minutes = (in_minuts % 60) / 60 # 余りの分を時間に変換する……(2)
print(out_hour + out_minutes) # 変換結果
結果は、
[bash]2.0
[/bash]
今度は、予測よりも値が大きくなってしまいました。
改めて、プログラムの動きを見てみましょう。
ここは、与えられた分数の中に、いくつの60分があるかを計算して、時間に変換しようとしています。
(その後、余りを求める(2)で、分になる部分を割り出しています)
つまり、90分÷60分は1余り30の商である1になることを期待しているわけです。
しかし、実際の(1)の結果は、小数まで計算した結果になっています。これは、out_hourもin_minutsも小数を格納できる変数ですので、コンピュータが90分÷60分を計算した結果です。(1.5になっています)
コンピュータは人が「どんなつもりでプログラムを書いているのか」など知りませんので、言われるがまま素直に計算したと言えます。
(2)についても、同様です。(0.5になっています)
そのため、結果として1.5+0.5の2.0が表示されるわけです。
この場合の対策には、以下の2つの方法があります。
・結果を意図に合わせて丸める(切り捨てる)
・コンピュータに「整数の計算」だと教える
今回は計算についてですので、前者について説明しましょう。
切り捨て、切り上げ、四捨五入
人が切り捨てや四捨五入などをするときは、特になにかの記号で表現することもなく、頭の中で計算してしまいますが、コンピュータにはそんなことできません。
そのため、プログラムで四捨五入をさせるためには、四捨五入のための処理を書いてあげなければいけません。
Rubyでは、以下のメソッドを使うことで、切り捨てと切り上げ、四捨五入を表現します。
メソッド | 説明 |
---|---|
floor | 小数部を切り捨てる。 負の数の場合は、数値を小さくする側に丸めます(-1.5→-2) |
ceil | 小数部を切り上げる。 負の数の場合は、数値を大きくする側に丸めます(-1.5→-1) |
round | 指定した桁までの四捨五入を行います。 1:小数部第二位を四捨五入、0:小数部第一位の四捨五入、-1:整数部第一位を四捨五入 |
これらを使って、先ほどの「分から時間に変換するプログラム」を修正します。
in_minuts = 90.0 # 時間に変換したい分
out_hour = 0.0 # 変換した時間部分
out_minuts = 0.0 # 変換した分部分
out_hour = in_minuts / 60 # 時間をとるため、60で割った商を得る……(1)
out_hour = out_hour.floor # 商だけ残すために小数点以下を切り捨てる……(3)
out_minutes = (in_minuts % 60) / 60 # 余りの分を取得する……(2)
print(out_hour + out_minutes)
具体的に修正(追加)したのは、(3)だけです。
どういった動きになるか、しっかりと考えた上で、実行して確認しましょう。
まとめ
コンピュータは電子計算機ですので、計算は得意です。しかし、正しくプログラムを組まなければ、作り手の意図した結果を出せません。
Rubyは比較的感覚的にプログラムを作れますが、ここに書いてある演算子や小数の扱いなどには気をつけて、プログラムを作っていきましょう。
・Rubyの演算子は+,-,*,/,%,**がある
・%は割り算の余りを求める演算子
・**は累乗を求める演算子
・/は商を得る演算子だが、意識せずに使うと、できる限り計算した小数が得られる
・切り捨てと切り上げ、四捨五入はメソッドを使って求める
・コンピュータは、プログラムに書いてある通りにしか動かない