1.说明
python原生数据类型在进行浮点运算时,可能会由于精度问题导致计算结果不准确,尤其是浮点数和较大的数据进行运算,所以如果对数据精度有要求,比如说金额,我们就需要使用decimal这个库
2.精度
decimal的精度默认是28位,可以自定义,通过getcontext获取线程上下文,然后修改prec属性即可
from decimal import Decimal, getcontext
print(getcontext().prec) # 计算精度,默认是28
getcontext().prec = 100 # 可修改
3.Decimal
我们可以通过实例化Decimal对象时传入value参数把其他的数据类型转换成Decimal类型。注意,尽量传入整数和字符串,如果传入float会导致结果不准确(float本身就存在精度问题)
a = Decimal("5632569878.6514126") # Decimal(5632569878.6514126)
b = Decimal("7") # Decimal(7)
c = Decimal(63) # Decimal(63)
d = Decimal.from_float(6.325) # Decimal(6.32500000000000017763568394002504646778106689453125), 不准确
4.普通计算
Decimal类型也可以像python基本数据类型那样进行加减乘除等运算
a = Decimal("8.651") # Decimal(8.651)
b = Decimal("7") # Decimal(7)
print(type(a + b), a + b) # <class 'decimal.Decimal'> 15.651
print(a - b, ) # Decimal(1.651)
print(a * b, ) # Decimal(60.557)
print(a / b, ) # Decimal(1.235857142857142857142857143)
print(a // b, ) # Decimal(1)
print(a ** 2, ) # Decimal(74.839801)
5.保留小数
decimal有多种保留小数位数的方式,如下
代号 | 说明 |
---|---|
ROUND_CEILING | 总是趋向正无穷大方向取值 |
ROUND_FLOOR | 总是趋向负无穷大方式取值 |
ROUND_DOWN | 总是趋向0方向取值 |
ROUND_UP | 总是趋向0的反方向取值 |
ROUND_HALF_UP | 四舍五入,即当大于等于5,朝远离0的方向取值 |
ROUND_HALF_DOWN | 最后一个有效数字大于或等于5则朝0反方向取整,否则,趋向0取值 |
ROUND_HALF_EVEN | 类似于ROUND_HALF_DOWN,不过,如果最后一个有效数字值为5,则会检查前一位。偶数值会导致结果向下取整,奇数值导致结果向上取整 |
ROUND_05UP | 如果最后一位是0或5,则朝0的反方向取整;否则向0取整 |
from decimal import Decimal, ROUND_CEILING, ROUND_FLOOR, ROUND_DOWN, ROUND_HALF_UP, ROUND_HALF_DOWN
print(Decimal("15.987654321").quantize(Decimal("0.00000"), ROUND_CEILING)) # 15.98766,正无穷大向上取值
print(Decimal("-15.987654321").quantize(Decimal("0.00000"), ROUND_CEILING)) # -15.98765,负无穷大向上取值
print(Decimal("15.987654321").quantize(Decimal("0.00000"), ROUND_FLOOR)) # 15.98765,负无穷大向下取值
print(Decimal("-15.987654321").quantize(Decimal("0.00000"), ROUND_FLOOR)) # -15.98766,负无穷大向下取值
print(Decimal("15.987654321").quantize(Decimal("0.00000"), ROUND_DOWN)) # 15.98765,趋向0取值
print(Decimal("-15.987654321").quantize(Decimal("0.00000"), ROUND_DOWN)) # -15.98765,趋向0取值
文章出处登录后可见!
已经登录?立即刷新