6.3. fractions — 分数运算
目的:实现一个用于处理有理数的类。
Fraction
类基于 numbers
模块中的 Rational
API 实现了有理数的数值运算。
创造一个 Fraction 的实例。
和 decimal
模块一致,新的值可以通过几种不同的方法进行创建。其中一种简单的方法是通过单独的分子和分母值进行创建。
fractions_create_integers.py
import fractions
for n, d in [(1, 2), (2, 4), (3, 6)]:
f = fractions.Fraction(n, d)
print('{}/{} = {}'.format(n, d, f))
在计算新值时,如下所示,结果总是保持最小公分母。
$ python3 fractions_create_integers.py
1/2 = 1/2
2/4 = 1/2
3/6 = 1/2
另一种创建 Fraction
实例的方法是使用形如 分子 / 分母
的字符串,如下所示:
fractions_create_strings.py
import fractions
for s in ['1/2', '2/4', '3/6']:
f = fractions.Fraction(s)
print('{} = {}'.format(s, f))
传入的字符串将被解析为相对应的分子以及分母。
$ python3 fractions_create_strings.py
1/2 = 1/2
2/4 = 1/2
3/6 = 1/2
传入字符串的表现形式还可以是更加常见的带小数点的浮点数或是科学计数法。只要传入的字符串可以被 float()
函数解析并且所得结果不为 NaN
(不是一个数字) 或者无穷数,该字符串即可被 Fraction
类解析。
fractions_create_strings_floats.py
import fractions
for s in ['0.5', '1.5', '2.0', '5e-1']:
f = fractions.Fraction(s)
print('{0:>4} = {1}'.format(s, f))
对应的浮点数字符串将被自动地表示为相对应的分子和分母。
$ python3 fractions_create_strings_floats.py
0.5 = 1/2
1.5 = 3/2
2.0 = 2
5e-1 = 1/2
还可以通过传入 float
或者 Decimal
表示的有理数来创建 Fraction
实例。
fractions_from_float.py
import fractions
for v in [0.1, 0.5, 1.5, 2.0]:
print('{} = {}'.format(v, fractions.Fraction(v)))
不能够精确表达的浮点数可能会产生意想不到的结果。
$ python3 fractions_from_float.py
0.1 = 3602879701896397/36028797018963968
0.5 = 1/2
1.5 = 3/2
2.0 = 2
使用 Decimal
进行表示的数值总是可以得到期待的结果。
fractions_from_decimal.py
import decimal
import fractions
values = [
decimal.Decimal('0.1'),
decimal.Decimal('0.5'),
decimal.Decimal('1.5'),
decimal.Decimal('2.0'),
]
for v in values:
print('{} = {}'.format(v, fractions.Fraction(v)))
Decimal
的内部实现机制使得在转化过程中不受浮点数表示误差的影响。
$ python3 fractions_from_decimal.py
0.1 = 1/10
0.5 = 1/2
1.5 = 3/2
2.0 = 2
算术运算
一旦分数被初始化,它们可以用于数学表达式。
fractions_arithmetic.py
import fractions
f1 = fractions.Fraction(1, 2)
f2 = fractions.Fraction(3, 4)
print('{} + {} = {}'.format(f1, f2, f1 + f2))
print('{} - {} = {}'.format(f1, f2, f1 - f2))
print('{} * {} = {}'.format(f1, f2, f1 * f2))
print('{} / {} = {}'.format(f1, f2, f1 / f2))
支持所有标准运算符。
$ python3 fractions_arithmetic.py
1/2 + 3/4 = 5/4
1/2 - 3/4 = -1/4
1/2 * 3/4 = 3/8
1/2 / 3/4 = 2/3
近似值
Fraction
一个有用的功能是能够将一个浮点数转化为一个近似的有理数。
fractions_limit_denominator.py
import fractions
import math
print('PI =', math.pi)
f_pi = fractions.Fraction(str(math.pi))
print('No limit =', f_pi)
for i in [1, 6, 11, 60, 70, 90, 100]:
limited = f_pi.limit_denominator(i)
print('{0:8} = {1}'.format(i, limited))
可以通过限制分母的大小控制分数值。
$ python3 fractions_limit_denominator.py
PI = 3.141592653589793
No limit = 3141592653589793/1000000000000000
1 = 3
6 = 19/6
11 = 22/7
60 = 179/57
70 = 201/64
90 = 267/85
100 = 311/99
推荐阅读
- fractions 标准库文档
decimal
--decimal
提供了用于固定和浮点数学的API。numbers
-- Numeric 抽象基类。- fractions Python 2 到 3 升级提醒
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。