Python十进制-除法,舍入,精度

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

Python十进制模块可帮助我们进行适当的除法和数字舍入。

Python十进制模块

在Python十进制模块的这一课中,我们将了解如何在程序中管理十进制数字,以进行精度和格式化以及计算。

如果数字处理不正确,十进制数字的精度很容易丢失。
让我们看看小数模块及其可用功能如何在这些方面提供帮助。

使用十进制数字

小数只是具有固定小数点的浮点数。
我们必须根据需要正确地四舍五入数字,否则结果可能会出乎意料。
Python的十进制模块可帮助我们更精确地使用十进制数字。

需要十进制模块

在实际使用此模块之前,让我们看看我们在谈论什么精度,并确定为什么实际上需要此模块。

查看以下代码片段:

division = 72/7
print(division)

好吧,答案实际上并不准确,根本没有小数点!让我们看看如何使用十进制模块来纠正此问题。

使用十进制模块

在本文中创建的所有程序中,我们将在所有程序中导入小数模块:

import decimal

可能是我们只从该模块导入特定功能的情况。
可以这样完成:

from decimal import Decimal

让我们开始将十进制模块放入某些程序中。

Python十进制模块示例

现在,我们将从与该模块有关的示例开始。

用小数更正除法

其中我们将更正上面编写的程序以执行应该产生浮点结果的除法。
带有十进制模块的修改程序如下所示:

import decimal

division = decimal.Decimal(72)/decimal.Decimal(7)
print(division)

让我们看一下该程序的输出:请注意,该除法现在是正确且精确的,还是太精确了?

单次操作的控制精度

在上一个程序中,答案现在有25个小数位。
但是,如果我们只想要最多三位十进制值怎么办?这也是可以控制的。
其中我们将控制答案的精度,该精度不会反映在程序的其他操作中:

import decimal

with decimal.localcontext() as ctx:
  ctx.prec = 3
  division = decimal.Decimal(72)/decimal.Decimal(7)
  print(division)

again = decimal.Decimal(72)/decimal.Decimal(7)
print(again)

我们做了两次除法运算以证明这一点。
让我们看看该程序的输出:有发现什么吗?我们设置的精度仅一次有效。
下次我们进行除法时,我们得到了相同的结果。

控制精度,可完成整个程序

也可以在程序中全局控制精度。
当您在程序中处理大量数字时,建议不要始终使用此方法。
这是一个例子:

import decimal

decimal.getcontext().prec = 3

division = decimal.Decimal(72)/decimal.Decimal(7)
print(division)

again = decimal.Decimal(72)/decimal.Decimal(7)
print(again)

四舍五入

可以使用round(...)函数优雅地四舍五入数字。

import decimal

#Can be rounded to 13.48 or 13.49
rounded = round(13.485, 2)
print(rounded)

让我们看一下该程序的输出:程序中的数字可以四舍五入为13.48或者13.49。
默认情况下,round(...)函数会向下舍入。
也可以更改:

import decimal

#Can be rounded to 13.48 or 13.49
rounded = round(13.485, 2)
print(decimal.Decimal(rounded).quantize(decimal.Decimal('0.00'), rounding=decimal.ROUND_UP))

获取Python十进制上下文

如果有兴趣查看默认为十进制模块设置的默认上下文,则可以使用以下脚本:

from decimal import *
print(getcontext())