Python自带的decimal模块用于十进制数学计算,它是在浮点类型的基础上设计的,可以非常精确地在计算机中存储和计算,精度优于floating point,因为浮点数并不能精确的表示十进制数,因为计算机由底层CPU和IEEE 754标准通过自己的浮点单位去执行算术时的特征,因此对于精度要求高但效率不要求的场景,比如财务等,decimal可以较好的替换float类型。
Decimal重载了简单的算术运算符,所以可以采用内置数值类型同样的方式处理 Decimal实例。Decimal构造函数取一个整数或字符串作为参数。使用浮点数创建 Decimal 之前,可以先将浮点数转换为一个字符串,使调用者能够显式地处理值得位数,还可以由元组创建,其中包含一个符号标志(0 表示正,1 表示负)、数字 tuple 以及一个整数指数。
>>>
>>> f1 = 1.23
>>> f2 = 3.21
>>> f1 + f2
4.4399999999999995
>>>
>>> from decimal import Decimal
>>> from decimal import getcontext
>>>
>>> d1 = Decimal('1.23')
>>> d2 = Decimal('3.21')
>>> d3 = d1 + d2
>>> print(type(d3), d3)
<class 'decimal.Decimal'> 4.44
>>> # 很准,位数也不变
>>>
>>>
>>> t1 = (1, (1, 1), -2)
>>> Decimal(t1)
Decimal('-0.11')
>>> t2 = (1, (1, 2), 3)
>>> Decimal(t2)
Decimal('-1.2E+4')
>>> t3 = (0, (1, 2), 3)
>>> Decimal(t3)
Decimal('1.2E+4')
>>>
>>> str(f3)
'2.468'
>>>
但相除或相乘的话,小数点的位数还是变了:
>>>
>>> d4 = d2 /