【Ruby初心者入門説明書】数値と四則計算について解説

2024.01.11

足す、引く、掛ける、割るといった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)

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

\プログラミングスクールを比較/

DMM WEBCAMP

COACHTECH

RUNTEQ

DMM WEBCAMP COACHTECH RUNTEQ
目指せる姿 WEBエンジニアへの転職
フリーランスエンジニア WEBエンジニアへの転職
分割払い
補助金 ×
転職保証 × ×
受講期間 12週間〜 3ヶ月〜 5ヶ月〜
特徴 【IT業界の転職を一番に考えたい方向け】
大手DMMが運営のプログラミングスクール
転職成功率98.8%
豊富なキャンペーンや補助金制度あり
【フリーランスを目指したい方向け】
フリーランスのエンジニアを最短で目指す
エンジニアと共に実際の案件開発を担当
【とことん勉強してから転職したい方向け】
1,000時間(約9カ月)のカリキュラムでしっかり勉強
企業の求める即戦力のWEBエンジニアを目指す
料金 329,350円〜
※給付金適用後
42万9,000円~ 55万円

公式HP

公式HP

公式HP

関連記事

資料請求

  • 短期集中で最速エンジニア転職を実現-転職成功者インタビュー一覧

    DMM WEBCAMPでは転職成功率98%を実現しています。本資料では、元警察官や元ラーメン屋など様々なバックグラウンドを持つ卒業生の声をお届けします。

    資料をダウンロードする
  • IT技術がもたらす3つの変化と身につけるべきスキル

    IT技術の発展により、今後10~20年程度で47%の仕事がなくなると言われています。どのような変化が訪れ、私達はどのようなスキルを身につけるべきかを解説します。

    資料をダウンロードする
  • 未経験がフリーランスエンジニアになる方法-年収アップで自由な働き方を手に入れる

    働き方改革やリモートワークの影響でフリーランスという働き方の人気は高まりつつあります。フリーランスエンジニアとして活躍するために必要な情報をお届けします。

    資料をダウンロードする

© 2024 WEBCAMP MEDIA Powered by AFFINGER5