Python 十进制 – 除法,四舍五入,精度

Python的decimal模块有助于我们以正确的精度进行除法运算,并对数字进行四舍五入。

Python decimal模块

在这个关于Python中decimal模块的课程中,我们将看到如何在程序中管理十进制数,以确保精度、格式和正确进行计算。如果没有正确处理数字,使用十进制数字时很容易失去精度。让我们看看decimal 模块及其可用的函数如何在这些方面提供帮助。

使用十进制数字

十进制数字只是带有固定小数点的浮点数。根据我们的需求正确舍入数字是非常重要的,否则结果可能出乎意料。Python的decimal模块帮助我们更精确地处理十进制数字。

需要使用decimal模块

在实际使用该模块之前,让我们看看我们需要什么样的精度,并确定我们实际上为什么需要这个模块。看一下以下代码片段:

division = 72 / 7
print(division)

让我们看看这个程序的输出: 好吧,答案实际上并不准确,而且根本没有小数点!让我们看看如何通过使用decimal模块来纠正这个问题。

使用decimal模块

在本文中,我们将在所有程序中导入decimal模块:

import decimal

也可能有这样的情况,我们只从该模块中导入特定的函数。可以这样做:

from decimal import Decimal

让我们开始将decimal模块应用到一些程序中。

Python decimal模块示例

现在我们将开始示例相关的模块。

修正带有小数的除法

这里,我们将修正我们上面编写的程序,使其执行应产生浮点结果的除法。使用 decimal 模块修改后的程序将如下所示:

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

# 可以四舍五入为13.48或13.49
rounded = round(13.485, 2)
print(rounded)

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

import decimal

# 可以四舍五入为13.48或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())

让我们看一下这个程序的输出:这就是关于 Python 十进制模块的全部内容,当处理浮点数时非常有用。

Source:
https://www.digitalocean.com/community/tutorials/python-decimal-division-round-precision