目录

  • 前言
  • 问题
  • 解决方案
  • 导入
  • Fractions类
  • 限制分母
  • 其他方法


前言

你可能不需要经常处理分数,但当你需要时,Python的Fraction类会给你很大的帮助。本文将给大家详细介绍关于利用标准库fractions模块让Python支持分数类型的相关内容。

问题

代码中涉及到分数计算问题。

解决方案

fractions模块提供了分数类型的支持。

导入

fractions模块是python自带模块,不需要安装,直接倒入即可

import fractions

Fractions类

该类是fractions模块的核心,它继承了numbers.Rational类并且实现了该类所有的方法。

class fractions.Fraction(numerator=0, denominator=1) 
class fractions.Fraction(int|float|str|Decimal|Fraction)

可以同时提供分子(numerator)和分母(denominator)给构造函数用于实例化Fraction类,但两者必须同时是int类型或者numbers.Rational类型,否则会抛出类型错误。当分母为0,初始化的时候会导致抛出异常ZeroDivisionError

而如果只提供一个参数,则可以用上述五种类型进行初始化。当使用字符串进行初始化时,fractions模块使用内置的正则表达式进行匹配。而使用浮点数或者Decimal进行初始化时,fractions模块会在内部调用as_integer_ratio()

下面的代码示例,展示了各种实例化Fraction的方式:

from fractions import Fraction

Fraction(numerator=16, denominator=-10)
Fraction(-8, 5)
	
默认: Fraction()
     Fraction(0, 1)

int: Fraction(123)

str: Fraction('3/7')
     Fraction(' -3/7 ')
     Fraction('1.414213 \t\n')
     Fraction('-.125')
     Fraction('7e-6')

float: Fraction(2.25)
       Fraction(1.1)

from decimal import Decimal
f = Fraction(Decimal('1.1'))

获取分子: f.numerator
获取分母: f.denominator

限制分母

有时候将浮点数或者Decimal作为Fraction实例的初始化数据可能会遇到舍入误差的问题,如上面调用Fraction(1.1)时不返回Fraction(11, 10)的例子。这时Fraction类提供了一个实例方法limit_denominator()用于减小这种误差。这个方法本来是为了通过限制分母来得到一个近似值,但是在出现舍入误差的时候反倒使得结果更加精确了,如下面的例子:

from fractions import Fraction
Fraction(1.1)
>>>Fraction(2476979795053773, 2251799813685248)

Fraction(1.1).limit_denominator()
>>>Fraction(11, 10)

将Fraction用于算术运算、关系运算和其他多种操作

上面提到,Fraction类继承了numbers.Rational类并且实现了该类所有的方法。所以Fraction类事实上通过重载很多特殊函数,使得其实例可以直接用于多种算术运算。

不仅支持算术运算,Fraction类同时也支持关系运算、pickle模块、copy模块和哈希值的计算。

其他方法

fractions.Fraction.from_float(f=1.1) 
fractions.Fraction.from_decimal(dec=deciaml_obj)

在Python3.2之前,Fraction类不支持通过将浮点数和Decimal传入构造方法来获得实例。
而是提供了上面两个类方法,通过调用类方法的方式来产生实例,目前版本(Python 3.6.1)这两个类方法仍然存在。