牛骨文教育服务平台(让学习变的简单)

decimal 模块提供了一个 Decimal 数据类型用于浮点数计算。相比内置的二进制浮点数实现float,这个类型有助于

  • 金融应用和其它需要精确十进制表达的场合,
  • 控制精度,
  • 控制舍入以适应法律或者规定要求,
  • 确保十进制数位精度,或者
  • 用户希望计算结果与手算相符的场合。

例如,计算 70 分电话费的 5% 税计算,十进制浮点数和二进制浮点数计算结果的差别如下。如果在分值上舍入,这个差别就很重要了:

>>> from decimal import *
>>> round(Decimal("0.70") * Decimal("1.05"), 2)
Decimal("0.74")
>>> round(.70 * 1.05, 2)
0.73

Decimal 的结果总是保有结尾的 0,自动从两位精度延伸到4位。Decimal 重现了手工的数学运算,这就确保了二进制浮点数无法精确保有的数据精度。

高精度使 Decimal 可以执行二进制浮点数无法进行的模运算和等值测试:

>>> Decimal("1.00") % Decimal(".10")
Decimal("0.00")
>>> 1.00 % 0.10
0.09999999999999995

>>> sum([Decimal("0.1")]*10) == Decimal("1.0")
True
>>> sum([0.1]*10) == 1.0
False


decimal 提供了必须的高精度算法:

>>> getcontext().prec = 36
>>> Decimal(1) / Decimal(7)
Decimal("0.142857142857142857142857142857142857")