在Django中遇到商品金额时只知道使用decimalfiled,但是并不是特别了解底层的python decimal模块,偶然看书学习到这块,做个记录跟博友们一起分享。
decimal 模块是python内置模块, 不需要安装,直接导入即可
import decimal
简单使用
d = decimal.Decimal('3.1415926')
在python3环境中,这里最好传入一个字符串,如果传入了一个浮点型,decimal对象的浮点精度得不到保证。
想要控制浮点精度时,可以通过
decimal.getcontext().prec = 3
执行完这条语句后,所有非直接通过直创建得来的decimal对象,比如通过计算得来的decimal对象,输出时的精度都将以这条赋值的精度为准,本质是设置了全局精度。
也可以使用小数上下文管理器,重新 设置一个临时小数精度。在语句退出后,精度重新设为初始值。
执行代码
d = decimal.Decimal(3)
a = decimal.Decimal(3.1415926)
print(d) # 3
print(a) # 3.14159260000000006840537025709636509418487548828125
print(d+a+a) # 9.283185200000000136810740514
#设置全局精度
decimal.getcontext().prec = 2
d = decimal.Decimal(3)
a = decimal.Decimal('3.1415926')
print(d) # 3
print(a) # 3.1415926
print(d+a+a) # 9.28
#小数上下文管理器
with decimal.localcontext() as ctx":
ctx.prec = 3
print(d+a+a) # 9.283
#管理器语句退出后,精度恢复
print(a+a) # 6.28
print(d+a) # 6.14