fractions 模块提供了对有理数运算的支持。
一个 Fraction 实例可以由一对整数、另一个有理数或字符串构造。
class fractions.Fraction(numerator=0, denominator=1)
解析:numerator 和 denominator 参数是 numbers.Rational 的实例,并且返回一个值为 numerator / denominator 的 Fraction 实例。如果 denominator 参数为 0,将抛出 ZeroDivisionError 异常。
class fractions.Fraction(other_fraction)
解析:other_fraction 参数(另一个分数)是 numbers.Rational 的实例,并返回具有相同值的 Fraction 实例。
class fractions.Fraction(float)
解析:返回一个与 float 参数具有相同值的 Fraction 实例。
注意:由于众所周知的浮点数问题,导致 Fraction(1.1) 并不完全等于 11 / 10,所以 Fraction(1.1) 也不会返回 Fraction(11, 10)。
class fractions.Fraction(decimal)
解析:返回一个与 decimal.Decimal 参数具有相同值的 Fraction 实例。
注意:由于众所周知的浮点数问题,导致 Fraction(1.1) 并不完全等于 11 / 10,所以 Fraction(Decimal(1.1)) 也不会返回 Fraction(11, 10)。
class fractions.Fraction(string)
解析:参数是一个 string 或 unicode 实例,其常见形式如下。
- [sign] numerator [‘/’ denominator]
复制代码
可选的 sign 可以是 + 或 -,然后 numerator 和 denominator(可选)是十进制数字。
无论哪种形式,输入字符串都可能有前导和/或尾随空格。
下面是一些例子,大家可以参考一下 fraction 模块的用法:
- >>> from fractions import Fraction
- >>> Fraction(16, -10)
- Fraction(-8, 5)
- >>> Fraction(123)
- Fraction(123, 1)
- >>> Fraction()
- Fraction(0, 1)
- >>> Fraction(‘3/7’)
- Fraction(3, 7)
- >>> Fraction(‘ -3/7 ‘)
- Fraction(-3, 7)
- >>> Fraction(‘1.414213 \t\n’)
- Fraction(1414213, 1000000)
- >>> Fraction(‘-.125’)
- Fraction(-1, 8)
- >>> Fraction(‘7e-6’)
- Fraction(7, 1000000)
- >>> Fraction(2.25)
- Fraction(9, 4)
- >>> Fraction(1.1)
- Fraction(2476979795053773, 2251799813685248)
- >>> from decimal import Decimal
- >>> Fraction(Decimal(‘1.1’))
- Fraction(11, 10)
复制代码
Fraction 类继承自抽象基类 numbers.Rational,并实现该类的所有方法和操作。
Fraction 实例是可哈希的,所以应该被视为不可变对象。
另外,Fraction 拥有下面这些属性和方法:
numerator
分数的分子。
denominator
分数的分母。
from_float(flt)
构造并返回一个分数,用于表示 flt 参数的确切值。
flt 参数必须是一个浮点数。
注意:由于众所周知的浮点数问题,Fraction.from_float(0.3) 跟 Fraction(3, 10) 不是相同值。
from_decimal(dec)
构造并返回一个分数,用于表示 dec 参数的确切值。
dec 参数必须是一个 decimal.Decimal 实例。
limit_denominator(max_denominator=1000000)
查找并返回与自身最接近的分数,max_denominator 参数指定分母可以接受的最大值。
这种方法对于寻找给定浮点数的有理逼近是有很用的:
- >>> from fractions import Fraction
- >>> Fraction(‘3.1415926535897932’).limit_denominator(1000)
- Fraction(355, 113)
复制代码
或者用于恢复表示为浮点数的有理数:
- >>> from math import pi, cos
- >>> Fraction(cos(pi/3))
- Fraction(4503599627370497, 9007199254740992)
- >>> Fraction(cos(pi/3)).limit_denominator()
- Fraction(1, 2)
- >>> Fraction(1.1).limit_denominator()
- Fraction(11, 10)
复制代码
__floor__()
返回一个小于或等于 self 的最大整数。
也可以通过 math.floor() 函数来实现该方法:
- >>> from math import floor
- >>> floor(Fraction(355, 113))
- 3
复制代码
__ceil__()
返回一个大于或等于 self 的最小整数。
也可以通过 math.ceil() 函数来实现该方法。
__round__()
返回一个最接近 self 的整数,四舍五入。
__round__(ndigits)
返回一个最接近 self 的有理数,ndigits 参数指定小数部分四舍五入的位数。
先介绍Fraction–处理分数类
它会将所传入的参数进行计算并输出分数形式,且会自动约分。如果有负数,则负号自动归于分子。
from fractions import Fraction
print(Fraction(2,-4)) #传入整数
# -1/2
#如果结果为Fraction(1,2),则只需使用str()函数即可
from fractions import Fraction
print(Fraction('1.5')) #传入字符型的浮点数
# 3/2
from fractions import Fraction
print(Fraction(1.5)) #传入浮点数
#3/2
#但如果浮点数不是.5形式,即 .1 .2 ... .7 .9
#就会出错,这是因为float本身的浮点数据不准确导致的
print(Fraction(1.1))
#2476979795053773/2251799813685248
#解决办法就是引入decimal模块
from fractions import Fraction
from decimal import Decimal
#Decimal所传入的参数不能以浮点数,原因一致
x = '1.1'
x = Decimal(x)
print(Fraction(x))
# 11/10
#所以如果要传入一浮点数,最好先将其转化成字符型
接下来是其特性在二元运算的体现
from fractions import Fraction
x = Fraction(1,2)
y = Fraction(2,5)
print(x+y)
# 9/10 --- 分数相加得分数
x = Fraction(1,2)
y = 1
print(x+y)
# 3/2 --- 分数加整数得分数
x = Fraction(1,2)
y = 1.2
print(x+y)
# 1.7 --- 分数加浮点数得浮点数
#减法 乘法 除法与加法相同
#乘方
print(Fraction(1,4)**2)
# 1/16 ---作底数 且指数为整数时 返回分数
print(Fraction(1,4)**Fraction(1,2))
# 0.5 ---底数指数同时是时 返回浮点数
print(Fraction(1,4)**0.5)
# 0.5 ---作底数 且指数为浮点数时 返回浮点数
print(0.25**Fraction(1,2))
# 0.5 ---作指数 且指数为浮点数时 返回浮点数
print(4**Fraction(1,2))
# 2.0 ---作指数 且指数为整数时 返回浮点数
获取Fraction对象属性
from fractions import Fraction x = Fraction(1,2) print(x.numerator) # 1 ---获取分子 print(x.denominator) # 2 ---获取分母
求最大公约数
import fractions print(fractions.gcd(66,33)) # 33