4. 数値
数値リテラル
数値は100
などの数字でそのまま表現します。
""
などで囲ってしまうと、文字列として認識されるので注意してください。
1
2
puts 100
#=> 100
Numeric
クラス下には、4つのクラスが存在しています
クラス名 | 型 | 例 |
---|---|---|
Integer |
整数 | -5, 0, 1, 10000 |
Float |
浮動小数点 | 0.1, -0.3, 0.000001 |
Complex |
複素数 | 3 - i , 4 + 9i |
Rational |
有理数 | 1/4, 33/109 |
Note : Bignum型とFixnum型
以前は整数型はBignum型とFixnum型にわかれていましたが、Ruby2.4にてInteger型に統合されました。
参考:Ruby 2.4でIntegerに一本化
代数演算子
演算子 | 内容 | 例 | 結果 |
---|---|---|---|
a + b |
加算 | 6 + 2 | 8 |
a - b |
減算 | 6 - 2 | 4 |
a * b |
乗算 | 6 * 2 | 12 |
a / b |
除算 | 6 / 2 | 3 |
a % b |
剰余 | 7 % 2 | 1 |
a ** b |
累乗 | 4 ** 2 | 16 |
代入演算子
演算子 | 元の式 | 内容 | 例 | 結果 |
---|---|---|---|---|
a += b |
a = a + b | 加算代入 | a = 4 + 2 | a = 6 |
a -= b |
a = a - b | 減算代入 | a = 4 - 2 | a = 2 |
a *= b |
a = a * b | 乗算代入 | a = 4 * 2 | a = 8 |
a /= b |
a = a / b | 除算代入 | a = 4 / 2 | a = 2 |
a %= b |
a = a % b | 剰余代入 | a = 4 % 2 | a = 0 |
a **= b |
a = a ** b | 累乗代入 | a = 4 ** 2 | a = 16 |
Attention! : インクリメント / デクリメント
Ruby にはa++
や++a
のような加算子(インクリメント)、減算子(デクリメント)はありません。
演算子の代入順位
演算子の優先度は以下のようになっています。
1
累乗 > 乗算 / 除算 / 剰余 > 加算 / 減算
演算子の優先順位とは異なる順序で演算を行いたい場合には括弧()
を使用します。
1
2
3
4
5
puts 4 ** 2 + 5 * 10
#=> 66 (16 + 50)
puts (5 + 3) * 4
#=> 32
小数点の演算
小数点の計算には注意が必要で、計算式で整数のみを扱ってしまうと、
たとえ解が小数であっても、小数点以下が切り捨てられてしまいます。
1
2
3
4
puts 10 / 8 #=> 1
puts 10 / 8.0 #=> 1.25
puts 10.0 / 8 #=> 1.25
puts 10.0 / 8.0 #=> 1.25
Numericクラスのメソッド
値の丸め(ceil・floor・round)
1
2
3
4
5
6
7
8
9
# 小数点切り上げ
puts (3.4).ceil #=> 4
# 小数点を切り捨て
puts (3.4).floor #=> 3
# 小数点を四捨五入
puts (3.4).round #=> 3
puts (3.5).round #=> 4
型変換(to_x)
1
2
3
4
5
num = 10
puts num.to_f #=> 10.0
num_str = "10"
puts num_str.to_f #=> 10.0
Note : 型変換を行うメソッド群
to_s
・to_i
・to_f
のような、
文字列(String
)・整数(Integer
)・小数(Float
)に変換してくれる関数はまとめて覚えておくと便利です。
これらの関数は、String
型・Integer型・Float型のいずれに対しても使うことができます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
num_str = "10"
num = 4
num_float = 0.4
p num_str / num
#=> error # String型とFixnum型では計算出来ない
p num_str.to_i / num
#=> 2 # Integer型とInteger型なので、Integerの答えが出力
p num_str.to_f / num
#=> 2.5 # Float型とInteger型なので、Float型の答えが出力
p num_str + num + num_float
#=> error # 型がバラバラ
p num_str.to_s + num.to_s + num_float.to_s
#=> "1040.4" # 全部String型なので足せる。(String型に.to_sもできる)
出力フォーマットを指定
「2014年1月1日」を「2014年01月01日」のように0詰めしたい場合などには、
printf
やsprintf
を使用します。
指定したフォーマットで出力する(printf・sprintf)
printf
メソッドは、指定したフォーマットで標準出力します。
1
2
3
4
5
6
7
year = 2014
month = 1
day = 1
# フォーマットして出力までしちゃう
printf("%04d%02d%02d", year, month, day)
#=> 20140101
また、sprintf
メソッドを使うことで、指定したフォーマットの文字列を得ることができます。
1
2
3
4
5
6
7
8
9
10
11
year = 2014
month = 1
day = 1
# フォーマットするだけなので、putsで出力
formated_year = sprintf("%04d", year)
formated_month = sprintf("%02d", month)
formated_day = sprintf("%02d", day)
puts "今日は#{formated_year}年#{formated_month}月#{formated_day}日です。"
#=> "今日は2014年01月01日です。"
Note : 正負の判定(Ruby2.3~)
Ruby2.3から正負を判定するのに便利なメソッド(positive?
・negative?
)が使用できるようになりました。positive?
は対象の値が正の数の場合true
、負の数の場合false
を返します。
一方、negative?
は対象の値が負の数の場合true
, 正の数の場合false
を返します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
num = 3
# 正の値に対して true
puts num.positive?
#=> true
# 負の値に対して false
puts num.negative?
#=> false
num = -3
# 正の値に対して false
puts num.positive?
#=> false
# 負の値に対して true
puts num.negative?
#=> true
ただし、0
に対してはどちらもfalse
を返します。
使用するときは注意しましょう。
値が0であるかを判定する方法として、zero?
というメソッドが用意されています。
1
2
3
4
5
6
7
8
9
10
11
12
13
# 0に対して
puts 0.positive?
#=> false
puts 0.negative?
#=> false
# 0かどうかを判定したい場合
puts 0.zero?
#=> true
puts 3.zero?
#=> false
後ほど学習するif文などの条件判断で使用することで、可読性が向上します。
研修中に使うRuby2.5ではこのメソッドが使えるので、ぜひ使ってみましょう。
※Ruby2.3以前のバージョンでは使用できないので注意が必要です。
演習問題
問1
3時間45分10秒を、すべて秒単位で表すプログラムを作成し、結果を出力してください。
1
2
# hour = 3 , min = 45 , sec = 10 の場合
#=> 13510秒
問2
税抜き価格を与えると、税込み価格(税率8%)が出力されるプログラムを作成してください。
税込価格が小数の場合は、四捨五入するようにしてください。
なお、それぞれの値は変数zeinuki
・zeikomi
にそれぞれ代入してください。
1
2
3
税抜価格を入力してください。
1000
#=> 税込価格は1080円です。