跳轉到內容

Python 和 Ruby 數學/Ruby 中的分數

來自 Wikibooks,開放世界開放書籍

分數只不過是一個整數與另一個整數的精確商。由於結果不一定是十進位制數,因此分數在十進位制數之前就已經被使用了:它們至少在埃及和巴比倫人那裡就已經為人所知。而且它們至今仍然有許多用途,即使它們或多或少地被隱藏起來,就像在這些例子中一樣

  1. 如果說一個男人身高 5 英尺 7 英寸,這意味著他以英尺為單位的身高是 .
  2. 聽說現在是下午 8 點 13 分,可以推斷出,過了中午, 小時過去了。
  3. 如果宣佈價格為“四分之三”,則意味著它以美元為單位是 :又一次,分數!
  4. 機率通常用分數表示(主要是 埃及 型別)。就像在“一顆流星落在我頭上的機率是千萬分之一”或“種馬以五比一的賠率是最受歡迎的”中一樣。
  5. 統計學也喜歡分數:“七個人中有五個人認為調查太多”。

等式0.2+0.5=0.7可以寫成 ,但相反, 不能寫成十進位制等式,因為這樣的等式將不準確。

如何在 Ruby 中獲取分數

[編輯 | 編輯原始碼]

要輸入分數,使用Rational 物件

a=Rational(24,10)
puts(a)

簡化是自動的。另一種方法是使用mathn,它會改變斜槓運算子的行為

require 'mathn'
a=24/10
puts(a)

還可以使用to_r 方法從實數中獲取分數。但是,只有當分母是 2 的冪時,才能確保分數是正確的[1]

a=1.2
b=a.to_r
puts(b)

在這種情況下,來自字串的to_r 更加準確

puts "1.2".to_r   #=> (6/5)
puts "12/10".to_r #=> (6/5)

分數的性質

[編輯 | 編輯原始碼]

要獲取分數f 的分子,輸入f.numerator

a=Rational(24,10)
puts(a.numerator)

請注意,結果不是 24,因為分數將簡化為 12/5。

要獲取分數f 的分母,輸入f.denominator

a=Rational(24,10)
puts(a.denominator)

分數的近似值透過轉換為float 獲得

a=Rational(24,10)
puts(a.to_f)


一元運算

[編輯 | 編輯原始碼]

與任何數字一樣,分數的否定是在其名稱前面加上減號“ - ”而獲得的

a=Rational(2,-3)
puts(-a)

要反轉分數,用 1 除以該分數

a=Rational(5,4)
puts(1/a)

二元運算

[編輯 | 編輯原始碼]

要新增兩個分數,使用“+”符號,結果將是一個分數。

a=Rational(34,21)
b=Rational(21,13)
puts(a+b)

如果將非分數新增到分數,則結果型別將有所不同。新增分數和整數將得到分數。但是,將分數和浮點數相加會得到浮點數。

同樣,要減去兩個分數,在它們之間寫上減號

a=Rational(34,21)
b=Rational(21,13)
puts(a-b)

兩個分數的乘積始終是一個分數

a=Rational(34,21)
b=Rational(21,13)
puts(a*b)

分數的整數商和餘數仍然定義

a=Rational(34,21)
b=Rational(21,13)
puts(a/b)
puts(a%b)

如果指數是整數,則分數的冪仍然是分數

a=Rational(3,2)
puts(a**12)
puts(a**(-2))

但如果指數是浮點數,即使冪實際上是分數,Ruby也會將其作為浮點數給出

a=Rational(9,4)
b=a**0.5
puts(b)
puts(b.to_r)

演算法

[編輯 | 編輯原始碼]

Farey 中介數

[編輯 | 編輯原始碼]

Ruby 沒有計算兩個分數的Farey 中介數的方法,但用定義很容易建立它

def Farey(a,b)
    n=a.numerator+b.numerator
    d=a.denominator+b.denominator
    return Rational(n,d)
end
 
 
a=Rational(3,4)
b=Rational(1,13)
puts(Farey(a,b))

埃及分數

[編輯 | 編輯原始碼]

要像埃及人那樣寫分數,可以使用斐波那契的演算法

def egypt(f)
    e=f.to_i
    f-=e
    list=[e]
    begin
        e=Rational(1,(1/f).to_i+1)
        f-=e
        list.push(e)
    end while f.numerator>1
    list.push(f)
    return list
end
 
require 'mathn'
 
a=21/13
puts(egypt(a))

該演算法可以總結如下

  1. 從分數中提取整數部分(使用to_i)並將其儲存在列表中;
  2. f(剩餘分數)中減去可能的最大整數倒數;
  3. 依此類推,直到f的分子大於 1。
  4. 最後,將最後一個分數新增到列表中。
  1. 好吧,確實但無論如何...
華夏公益教科書