【python】Decimal的使用

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)  #  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取值

你可能感兴趣的:(python,python,decimal,四舍五入,保留小数)