Ruby Integer

Ruby 教學 6 – Ruby Integer Object, Ruby Float Object 介紹

在 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

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)

如果覺得我的文章有幫助的話,歡迎幫我的粉專按讚哦~謝謝你!

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top