用分数计算分数(有理数)

商业

使用标准Python库的分数模块,你可以进行分数(有理数)的计算。

在此解释如下。

  • 分数的构造函数
  • 获取分子和分母的整数值
  • 分数的计算和比较(有理数)。
  • 将分数转换为小数(浮动)。
  • 分数到字符串(str)的转换
  • 获得有理数的近似值

分数的构造函数

有几种方法来创建一个分数实例。在所有情况下,分数都会被自动分成若干个分数。

将分子和分母指定为整数

分别指定分子和分母为整数。如果省略分母,则假定其为1。

from fractions import Fraction

print(Fraction(1, 3))
# 1/3

print(Fraction(2, 6))
# 1/3

print(Fraction(3))
# 3

小数部分 (float)

如果传递的是一个分数值,它将被转换为一个分数。

print(Fraction(0.25))
# 1/4

print(Fraction(0.33))
# 5944751508129055/18014398509481984

如果你希望通过指定一个最大分母来进行近似,请使用下面描述的limit_denominator()方法。

字符串 (str)

如果传递的是一个字符串值,它将被转换为一个分数。

print(Fraction('2/5'))
# 2/5

print(Fraction('16/48'))
# 1/3

获取分子和分母的整数值

类型为Fraction的属性允许你分别获得分子和分母的整数值。它们不能被改变。

  • numerator
  • denominator
a = Fraction(1, 3)
print(a)
# 1/3

print(a.numerator)
print(type(a.numerator))
# 1
# <class 'int'>

print(a.denominator)
print(type(a.denominator))
# 3
# <class 'int'>

# a.numerator = 7
# AttributeError: can't set attribute

分数的计算和比较(有理数)。

算术运算符可用于计算加法、减法等。

result = Fraction(1, 6) ** 2 + Fraction(1, 3) / Fraction(1, 2)
print(result)
print(type(result))
# 25/36
# <class 'fractions.Fraction'>

也可以使用比较运算符。

print(Fraction(7, 13) > Fraction(8, 15))
# True

将分数转换为小数(浮动)。

可以用float()将分数转换为小数。

a_f = float(a)
print(a_f)
print(type(a_f))
# 0.3333333333333333
# <class 'float'>

当用小数计算时,它被自动转换为浮点数类型。

b = a + 0.1
print(b)
print(type(b))
# 0.43333333333333335
# <class 'float'>

分数到字符串(str)的转换

要转换为字符串,请使用str()。

a_s = str(a)
print(a_s)
print(type(a_s))
# 1/3
# <class 'str'>

获得有理数的近似值

有理数的近似值可以通过类型为Fraction的limit_denominator()方法获得。

返回分母小于或等于参数max_denominator的有理数(分数)。如果省略,max_denominator=1000000。

近似的无理数,如π和Napier数e

pi = Fraction(3.14159265359)
print(pi)
# 3537118876014453/1125899906842624

print(pi.limit_denominator(10))
print(pi.limit_denominator(100))
print(pi.limit_denominator(1000))
# 22/7
# 311/99
# 355/113

e = Fraction(2.71828182846)
print(e)
# 6121026514870223/2251799813685248

print(e.limit_denominator(10))
print(e.limit_denominator(100))
print(e.limit_denominator(1000))
# 19/7
# 193/71
# 1457/536

将循环小数转换为分数

a = Fraction(0.565656565656)
print(a)
# 636872674577009/1125899906842624

print(a.limit_denominator())
# 56/99

a = Fraction(0.3333)
print(a)
# 6004199023210345/18014398509481984

print(a.limit_denominator())
print(a.limit_denominator(100))
# 3333/10000
# 1/3