Python分数

时间:2020-02-23 14:42:43  来源:igfitidea点击:

Python分数模块

众所周知,小数是一个数字,代表一个整数,它被分为多个部分。
Python分数模块允许我们在Python程序中管理分数。

管理分数

在此Python帖子中,我们将管理分数并对其执行各种操作。
让我们开始吧。

创建分数

Python中的Fraction类允许我们以各种方式创建其实例。
这是一个示例程序:

import fractions

for num, decimal in [(3, 2), (2, 5), (30, 4)]:
  fract = fractions.Fraction(num, decimal)
  print('{}/{} = {}'.format(num, decimal, fract))

让我们看一下该程序的输出:这意味着我们可以轻松地将分数转换为String并管理它以便在程序中进行调试。
另外,请注意,在最后的分数" 30/4"中,它会自动解析为最低形式的" 15/2"。

我们实际上还可以从其String表示形式创建一个分数,例如:

f = fractions.Fraction('2/7')

将小数转换为分数

也可以将小数转换为小数。
让我们看一下代码片段:

import fractions

for deci in ['0.6', '2.5', '2.3', '4e-1']:
  fract = fractions.Fraction(deci)
  print('{0:>4} = {1}'.format(deci, fract))

让我们看一下该程序的输出:易于管理,对吧?但这是一个问题,不能完全转换为分数的十进制值可能会产生意外的结果,例如:

import fractions

for v in [0.1, 0.5, 1.5, 2.0]:
  print('{} = {}'.format(v, fractions.Fraction(v)))

这将给出如下输出:注意" 0.1"表示形式的问题?让我们了解为什么会这样。

0.1表示的问题

众所周知,浮点数由两部分组成:一个整数和一个指数部分,其底数取整数并乘以整数部分。

"基数10"使数学运算和基数10一样非常容易,每个数字都可以很容易地显示出来。
0.5可以表示为5 x 10?¹。
因此,如果我们加上数字0.5和0.2,则结果将是0.7。
但是,计算机无法正常工作。
计算机使用Base 2而不是Base 10。

问题出现在可以用Base 10表示但不能用Base 2表示的数字上。
这些数字必须四舍五入到最接近的等值。
考虑到IEEE 64位浮点格式,最接近0.1的数字是" 3602879701896397 x 2 ???",最接近0.2的数字是" 7205759403792794 x 2 ???";将它们相加得到" 10808639105689191 x 2 ???",或者精确的十进制值" 0.3000000000000000444089209850062616169452667236328125"。
浮点数通常会四舍五入以显示。

算术运算

我们还可以很容易地用小数执行算术运算。
让我们在这里看一些例子。

执行数学运算

让我们构造一个简单的示例,说明如何使用小数执行算术运算。
这是一个示例程序:

import fractions

f_one = fractions.Fraction(3, 5)
f_two = fractions.Fraction(4, 9)

print('{} + {} = {}'.format(f_one, f_two, f_one + f_two))
print('{} - {} = {}'.format(f_one, f_two, f_one - f_two))
print('{} * {} = {}'.format(f_one, f_two, f_one * f_two))
print('{}/{} = {}'.format(f_one, f_two, f_one/f_two))

让我们看一下该程序的输出:

获取分数部分

可能仅获得分数的分子或者分母。
让我们看一下如何做到这一点的代码片段:

import fractions

fract = fractions.Fraction(221, 234) + fractions.Fraction(1, 2)
print("Numerator: {}".format(fract.numerator))
print("Denominator: {}".format(fract.denominator))

进行近似

我们可以使用分数模块将数字近似并四舍五入为有理值。
这是一个示例程序:

import fractions
import math

print('Value of PI: {}'.format(math.pi))

pi_fraction = fractions.Fraction(str(math.pi))
print('Without limit: {}'.format(pi_fraction))

for num in [1, 6, 11, 60, 70, 90, 100]:
  limited = pi_fraction.limit_denominator(num)
  print('{0:8} = {1}'.format(num, limited))

让我们看一下该程序的输出:limit_denominator()函数查找并返回最接近的分母,该分母具有最大为num的分母。

四舍五入

可以通过分母中所需的位数四舍五入小数。
让我们看一下代码片段:

import fractions

fract = fractions.Fraction('25/3')
print('25/3 Rounded without limit : {}'.format(round(fract)))
print('25/3 Rounded to 1 digit    : {}'.format(round(fract, 1)))
print('25/3 Rounded to 2 digits   : {}'.format(round(fract, 2)))

让我们看一下该程序的输出:请注意,round()是Python的默认解释器函数,不需要任何导入。

将数学与分数混合

在最后一个示例中,我们将从数学库中引入一些函数,并将它们与小数表示形式进行混合。
像铺砌一小部分等。
让我们看一下代码片段:

import math
from fractions import Fraction

print("25/2 Square root is:           {}".format(math.sqrt(Fraction(25, 4))))

print("28/3 Square root is:           {}".format(math.sqrt(Fraction(28,3))))

print("4102/1193 Floored to:          {}".format(math.floor(Fraction(4102, 1193))))

print("Pi/3 Sined Fraction:           {}".format(Fraction(math.sin(math.pi/3))))

print("Pi/3 Sined Fraction Limit Dn.: {}".format(Fraction(math.sin(math.pi/3)).limit_denominator(10)))

让我们看一下该程序的输出:floor()函数仅将小数点后一位舍入并提供最接近的整数。