Leon's Blogging

Coding blogging for hackers.

Ruby - Ruby 中的數字 & BigDecimal

| Comments

在程式中的運算可能跟我們平常接觸的會不一樣,ruby 也是!因此來瞭解一下吧!

integer

1
2
3
4
5
6
7
8
9
10
11
1.class
#=> Fixnum
(2/3).class
#=> Fixnum
#20 位數會開始變成 Bignum
('1'+'0'*18).to_i.class
#=> Fixnum
('1'+'0'*19).to_i.class
#=> Bignum
1.2.to_i
#=> 1

float

只要分子或分母出現浮點數,結果才會是 float

兩個運算元皆為整數,則會進行截尾整數除法(truncating integer division)運算

1
2
3
4
5
6
7
8
9
10
3.14.class
#=> Float
1/2
#=> 0
1/2.0
#=> 0.5
1.0/2
#=> 0.5
1.to_f
#=> 1.0

運算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
餘數
10%3
#=> 1

次方
2**10
#=> 1024
2**-1
#=> (1/2)

絕對值
-1234.abs
#=> 1234

四捨五入
(3.3).round
#=> 3
(4.5).round
#=> 5

回傳小於該數學的最大整數
(2.1).floor
#=> 2
(-2.1).floor
#=> -3

回傳大於該數學的最小整數
(2.1).ceil
#=> 3
(-2.1).ceil
#=> -2

#只適用於Fixnum
2.zero?
#=> false
0.zero?
#=> true

1.0 / 0    # Infinity
-1.0 / 0   # -Infinity
0.0 / 0.0  # NaN

BigDecimal

主要是用來做精確的數字

1
2
3
4
5
6
7
sum = 0
for i in (1..10000)
  sum = sum + 0.0001
end
print sum
#=> 0.9999999999999062
#因為在電腦中的浮點數其實只是近似值,浮點數中的整數可能只是精確度到達一定程度而已
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
require 'bigdecimal'

sum = BigDecimal.new("0")
for i in (1..10000)
  sum = sum + BigDecimal.new("0.0001")
end
print sum
#=> 0.1E1

E代表後面有幾個10的次方
0.1E1 = 0.1 * (10**1)
#=> 1.0
0.2E1 = 0.2 * (10**1)
#=> 2.0
0.2E2 = 0.2 * (10**2)
#=> 20.0
2E3   =   2 * (10**3)
#=> 2000.0

官方文件:

參考文件:

Comments