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_sto_ito_f のような、
文字列(String)・整数(Integer)・小数(Float)に変換してくれる関数はまとめて覚えておくと便利です。
これらの関数は、String型・Integer型・Float型のいずれに対しても使うことができます。

cast_methods.rb
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詰めしたい場合などには、
printfsprintfを使用します。

指定したフォーマットで出力する(printf・sprintf)

printfメソッドは、指定したフォーマットで標準出力します。

printf.rb
1
2
3
4
5
6
7
year = 2014
month = 1
day = 1

# フォーマットして出力までしちゃう
printf("%04d%02d%02d", year, month, day)
#=> 20140101

また、sprintfメソッドを使うことで、指定したフォーマットの文字列を得ることができます。

sprintf.rb
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を返します。

check_sign.rb
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?というメソッドが用意されています。

check_zero.rb
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%)が出力されるプログラムを作成してください。
税込価格が小数の場合は、四捨五入するようにしてください。
なお、それぞれの値は変数zeinukizeikomiにそれぞれ代入してください。

1
2
3
税抜価格を入力してください。
1000
#=> 税込価格は1080円です。