跳转到内容

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. 好吧,确实但无论如何...
华夏公益教科书