在python中已经提供了float类型,但是float的值会丢失精度,在计算钱的时候经常会多一份或少一分,不够精准。 而python的decimal模块就解决了精度丢失的问题,不会向float那样计算结果不准确,所以deciaml一般应用在需要精准计算的场景,比如金融行业,或进行结算的功能模块当中。

decimal常用方法

  • 可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确。
  • 要从浮点数据转换为Decimal类型
from decimal import *
Decimal.from_float(12.222)
# 结果为Decimal('12.2219999999999995310417943983338773250579833984375')
  • 通过设定有效数字,限定结果样式:
    from decimal import *
    getcontext().prec = 6
    Decimal(1)/Decimal(7)
    # 结果为Decimal('0.142857'),六个有效数字
  • 四舍五入,保留几位小数
from decimal import *
Decimal('50.5679').quantize(Decimal('0.00'))
# 结果为Decimal('50.57'),结果四舍五入保留了两位小数
  • Decimal 结果转化为string
from decimal import *
str(Decimal('3.40').quantize(Decimal('0.0')))
# 结果为'3.40',字符串类型
  • mysql 中的Decimal类型使用时一定先转化成str类型,然后再转python中的Decimal类型进行计算,由于Decimal(0.1111)不等于Decimal("0.1111"),所以在对比两个Decimal类型的值时,必须确保value的类型是一致的, 如下
print(Decimal(0.1111))
print(Decimal("0.1111"))

输出结果:

0.1111000000000000043076653355456073768436908721923828125
0.1111

由上面可以看出他们各自输出的值是不相等的,所以我们在使用的时候一定先将类型转成一致后在进行decimal运算