Python 在小数运算时,提供了除法、四舍五入和精度控制的功能
Python的decimal模块可以帮助我们在数字除法中实现正确的精度和四舍五入。
Python小数模块

处理十进制数
十进制数就是带有固定小数点的浮点数。根据我们的需求,我们必须正确地四舍五入数字,否则结果可能出乎意料。Python的decimal模块可以帮助我们更精确地处理十进制数。
需要十进制模块
在实际使用这个模块之前,让我们看看我们谈论的是什么精度,并确定为什么我们实际上需要这个模块。请看以下代码片段:
division = 72 / 7
print(division)

使用十进制模块(decimal模块)
在本帖中,我们将在所有程序中导入decimal模块。
import decimal
可能的情况是,我们只从这个模块中导入特定的函数。可以这样做:
from decimal import Decimal
让我们开始将十进制模块加入到一些程序中。
Python十进制模块示例
我们现在将从与本模块相关的示例开始。
纠正使用小数点进行除法
在这里,我们将修改之前编写的程序,使其执行除法操作,从而得到浮点数结果。带有 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
#Can be rounded to 13.48 or 13.49
rounded = round(13.485, 2)
print(rounded)

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 的 Decimal 上下文
如果你有兴趣查看默认的十进制模块默认上下文集合,你可以使用以下脚本:
from decimal import *
print(getcontext())
