在 Ruby 中,數字分為兩種 object:Integer 和 Float,分別代表整數和浮點數,兩個 Class 都是從 Numeric object 繼承而來:
num1 = 3
num2 = 3.14
p num1.class
# Integer
p num2.class
# Float
p num1.class.superclass
# Numeric
p num2.class.superclass
# Numeric
Integer, Float 和 Symbol 是 Ruby 中比較特別的 class,無法用 .new 宣告新的 object instance,可以參考這篇資料:Why can't I instantiate Integer class in Ruby? - Stack Overflow
Table of Contents
1. 宣告 Ruby Integer, Float Object
1.1 Integer
誠如上面提到的,無法用 class.new 宣告新的 object instance,但可以直接在 Integer class 後面接要宣告的 value,Integer 後面有兩個 argument:
- 第一個 argument 為 Integer 的 value,當只有這個 argument 時,input Integer 或 String 都可以
- 第二個 argument 為幾進位,有這個 argument 時,第一個 argument 只能輸入字串,否則會有 error
p Integer(10)
# 10
p Integer('10')
# default 為 10 進位
# 10
p Integer('10', 2)
# 2 進位
# 2
p Integer('10', 16)
# 16 進位
# 16
p Integer('0b10')
# 2
# 0b 代表 2 進位
p Integer('010')
# 8
# 0 代表 8 進位
p Integer('0x10')
# 16
# 0b 代表 16 進位
1.2 Float
Float 就沒那麼多變化了,後面直接接要宣告的 Float object value:
num1 = Float(3.14)
num2 = Float("3.14")
num3 = Float(3)
p num1
# 3.14
p num2
# 3.14
p num3
# 3.0
2. Operators
介紹一下 Numeric object 常用到的 operators:
2.1 Equal ==
會比較兩邊的 object 是否相等:
num1 = 3
num2 = 3.0
num3 = "3"
p num1 == num2
# true
p num1 == num3
# false
2.2 Inequal !=
會比較兩邊的 object 是否不等:
num1 = 3
num2 = 3.0
num3 = "3"
p num1 != num2
# false
p num1 != num3
# true
2.3 Spaceship Operator <=>
因為 <=> 長得像 spaceship,因此稱為 spaceship operator。
- 右邊大於左邊:回傳 -1
- 左邊大於右邊:回傳 1
- 兩邊相等:回傳 0
spaceship operator 常用在 array 的 sort 中。
p 3 <=> 5
# -1
p 7 <=> 5
# 1
p 5 <=> 5
# 0
2.4 Arithmetic Operators
簡單介紹一下四則運算符號:
p 4 + 3
p 4.+(3)
p 4.+ 3
# 7
p 4 - 3
p 4.-(3)
p 4.- 3
# 1
p 4 * 3
p 4.*(3)
p 4.* 3
# 12
p 4 / 3
p 4./(3)
p 4./ 3
p 4.div(3)
# 1
p 4 % 3
p 4.%(3)
p 4.% 3
p 4.modulo(3)
# 1
3. Integer Instance Methods
3.1 Integer odd?/even?
.odd? 和 .even? 用來判斷整數是奇數還是偶數,因此只存在於 Integer object instance,不存在於 Float object instance:
p 3.odd?
# true
p 3.even?
# false
p 3.14.odd?
# Error!
3.2 Integer abs
取絕對值:
num1 = 3
num2 = -3
p num1.abs
# 3
p num2.abs
# 3
3.2 Integer to_f
將 Integer object 轉成 Float object 並回傳:
num = 3
p num.to_f
# 3.0
p num.to_f.class
# Float
3.3 Integer to_s
將 Integer object 轉成 String object 並回傳:
num = 3
p num.to_s
# "3"
p num.to_s.class
# String
4. Float Instance Methods
4.1 Float floor
回傳 <= object 的最大 Integer 或 Float。
沒有 argument 時回傳整數,有 argument 時,argument 為取小數點到幾位。
num1 = 3.14
num2 = 3.64
num3 = -3.14
num4 = -3.64
p num1.floor
# 3
p num2.floor
# 3
p num3.floor
# -4
p num4.floor
# -4
num5 = 12345.6789
num6 = -12345.6789
p num5.floor(1)
# 12345.6
p num5.floor(3)
# 12345.678
p num6.floor(1)
# -12345.7
p num6.floor(3)
# -12345.679
4.2 Float ceil
無條件進位:
num1 = 3.14
num2 = 3.64
num3 = -3.14
num4 = -3.64
p num1.ceil
# 4
p num2.ceil
# 4
p num3.ceil
# -3
p num4.ceil
# -3
num5 = 12345.6789
num6 = -12345.6789
p num5.ceil(1)
# 12345.7
p num5.ceil(3)
# 12345.679
p num6.ceil(1)
# -12345.6
p num6.ceil(3)
# -12345.678
4.3 Float round
四捨五入:
num1 = 3.14
num2 = 3.64
num3 = -3.14
num4 = -3.64
p num1.round
# 3
p num2.round
# 4
p num3.round
# -3
p num4.round
# -4
num5 = 12345.6789
num6 = -12345.6789
p num5.round(1)
# 12345.7
p num5.round(3)
# 12345.679
p num6.round(1)
# -12345.7
p num6.round(3)
# -12345.679
4.4 Float truncate
無條件捨去
num1 = 3.14
num2 = 3.64
num3 = -3.14
num4 = -3.64
p num1.truncate
# 3
p num2.truncate
# 3
p num3.truncate
# -3
p num4.truncate
# -3
num5 = 12345.6789
num6 = -12345.6789
p num5.truncate(1)
# 12345.6
p num5.truncate(3)
# 12345.678
p num6.truncate(1)
# -12345.6
p num6.truncate(3)
# -12345.678
4.5 Floor abs
取絕對值:
num1 = 3.14
num2 = 3.64
num3 = -3.14
num4 = -3.64
p num1.abs
# 3.14
p num2.abs
# 3.64
p num3.abs
# 3.14
p num4.abs
# 3.64
4.6 Float to_i
轉換成 Integer object 後回傳,使用的是 truncate 方法 ( 因此和 .truncate 或是 .truncate(0) 一樣 ):
num1 = 3.14
num2 = 3.64
num3 = -3.14
num4 = -3.64
p num1.to_i
# 3
p num2.to_i
# 3
p num3.to_i
# -3
p num4.to_i
# -3
5. 參考資料
Learn to Code with Ruby
Class: Integer (Ruby 3.1.2)
Class: Float (Ruby 3.1.2)
Class: Numeric (Ruby 3.1.2)
如果覺得我的文章有幫助的話,歡迎幫我的粉專按讚哦~謝謝你!