【Ruby初心者入門説明書】数値と四則計算について解説 | プログラミング入門ならWEBCAMP NAVI
【1月枠も残りわずか】転職保証コース

【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")

数値の区切り

経理や事務の人であれば、特になじみがあるかもしれませんが、大きな数値を書くとき、以下のように桁を表す「,」を挿入する場合があります。

123,456,489

残念ながら、Rubyではこの表現ができません(「,」に別の意味があるため)。

そのため、Rubyで大きな桁の数を表現するとき、「,」の代わりに「_」を使うことができます。

123_456_489

ただし、これはあくまでも表記上の話で、プログラムは「_」なしの数値として認識しますので、プログラムからの出力には「_」は含まれていませんので、注意してください。

a = 123456
puts(a)

a = 123_456
puts(a)
123456
123456

計算するときの注意点

ここまでの説明を踏まえて、「分」から「時間」に変換するプログラムを作成してみましょう。

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行です。この部分について、結果を予測してください。

頭の中では、以下のような結果を予測するのではないでしょうか?

1.5

では、実行してみましょう。

1

なぜ、予測と違っているのかを説明していきましょう。

小数について

ポイントは割り算です。

割り算は、(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)  # 変換結果

結果は、

2.0

今度は、予測よりも値が大きくなってしまいました。

改めて、プログラムの動きを見てみましょう。

ここは、与えられた分数の中に、いくつの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の演算子は+,-,*,/,%,**がある
・%は割り算の余りを求める演算子
・**は累乗を求める演算子
・/は商を得る演算子だが、意識せずに使うと、できる限り計算した小数が得られる
・切り捨てと切り上げ、四捨五入はメソッドを使って求める
・コンピュータは、プログラムに書いてある通りにしか動かない

 

1月枠も残りわずか!!

エンジニア転職を目指すなら…

転職保証付きプログラミングスクール

で未経験からエンジニア目指そう

 

✔︎未経験からの転職 ✔︎会社の将来が不安 ✔︎給与や待遇に不満がある

 

転職保証コースは質の高いカリキュラムで転職成功率98%

 

転職保証付のDMM WEBCAMPで
安心してエンジニア転職を目指そう

「スキルがないし…」「失敗したくないし…」
カウンセラーがあなたのキャリアを真剣に考え、
ご相談に乗ります。