# python decimal 精确计算

python 专栏收录该内容
91 篇文章 0 订阅

## 经常使用的几个点

#### 1.可以传递给Decimal整型或者字符串参数，但不能是浮点数据，因为浮点数据本身就不准确。

In [74]: Decimal(5.55)*100

Out[74]: Decimal('554.9999999999999822364316060')

In [75]: Decimal('5.55')*100
Out[75]: Decimal('555.00')

### 2.要从浮点数据转换为Decimal类型

from decimal import *

Decimal.from_float(22.222)

# 结果为Decimal('22.2219999999999995310417943983338773250579833984375')

### 4.四舍五入，保留几位小数

from decimal import *

Decimal('50.5679').quantize(Decimal('0.00'))

# 结果为Decimal('50.57')，结果四舍五入保留了两位小数

### 5.Decimal 结果转化为string

from decimal import *

str(Decimal('3.40').quantize(Decimal('0.0')))

# 结果为'3.40'，字符串类型

from decimal import *
print(getcontext())  # Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, 。。。。。)
num,num1 = '12355','123.55'
getcontext().prec = len(num) +2
print(Decimal(num1)*100 == Decimal(num))   True
getcontext().prec = 3
# todo 如果prec的长度比数字的长度小的话，*100得出的数就不对了
print(Decimal(num1)*100)                   1.24E+4
print(Decimal(num1))                       123.55
print(Decimal(num1)*100 == Decimal(num))   False
print(Decimal(num))                        12355

## decimal模块进行十进制数学计算

python中的decimal模块可以解决上面的烦恼
decimal模块中，可以通过整数，字符串或原则构建decimal.Decimal对象。如果是浮点数，特别注意因为浮点数本身存在误差，需要先将浮点数转化为字符串。

>>> from decimal import Decimal>>> from decimal import getcontext

>>> Decimal('4.20') + Decimal('2.10')Decimal('6.30')

>>> from decimal import Decimal

>>> from decimal import getcontext

>>> x = 4.20

>>> y = 2.10

>>> z = Decimal(str(x)) + Decimal(str(y))

>>> zDecimal('6.3')

>>> getcontext().prec = 4 #设置精度

>>> Decimal('1.00') /Decimal('3.0')

## python decimal.quantize()参数rounding的各参数解释与行为

ROUND_CEILING (towards Infinity),
ROUND_DOWN (towards zero),
ROUND_FLOOR (towards -Infinity),
ROUND_HALF_DOWN (to nearest with ties going towards zero),
ROUND_HALF_EVEN (to nearest with ties going to nearest even integer),
ROUND_HALF_UP (to nearest with ties going away from zero), or
ROUND_UP (away from zero).
ROUND_05UP (away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise towards zero)

from decimal import *

x = Decimal('-3.333333333') + Decimal('-2.222222222')
print(x)   # -5.555555555
print(x.quantize(Decimal('1.0000'), ROUND_HALF_EVEN))    # -5.5556
print(x.quantize(Decimal('1.0000'), ROUND_HALF_DOWN))    # -5.5556
print(x.quantize(Decimal('1.0000'), ROUND_CEILING))      # -5.5555
print(x.quantize(Decimal('1.0000'), ROUND_FLOOR))        # -5.8599
print(x.quantize(Decimal('1.0000'), ROUND_UP))           # -5.8599
print(x.quantize(Decimal('1.0000'), ROUND_DOWN))         # -5.5555

ROUND_HALF_EVENT 和 ROUND_HALF_DOWN：EVENT是quansize的默认设置值，可以通过getcontext()得到，EVENT四舍五入进了一位，DOWN为接近最近的0进了一位。

ROUND_CEILING 和 ROUND_FLOOR：CEILING超过5没有进位是因为它倾向正无穷，FLOOR为了总是变得更小所以进了一位。

ROUND_UP 和 ROUND_DOWN：UP始终进位，DOWN始终不会进位。。

from decimal import *

x = Decimal('-3.333333333') + Decimal('-1.111111111')
print(x)   # 4.444444444
print(x.quantize(Decimal('1.0000'), ROUND_HALF_EVEN))    # -4.4444
print(x.quantize(Decimal('1.0000'), ROUND_HALF_DOWN))    # -4.4444
print(x.quantize(Decimal('1.0000'), ROUND_CEILING))      # -4.4444
print(x.quantize(Decimal('1.0000'), ROUND_FLOOR))        # -4.4445
print(x.quantize(Decimal('1.0000'), ROUND_UP))           # -4.4445
print(x.quantize(Decimal('1.0000'), ROUND_DOWN))         # -4.4444

ROUND_HALF_EVENT 和 ROUND_HALF_DOWN：EVENT是quansize的默认设置值，可以通过getcontext()得到，EVENT由于达不到四舍五入所以不进位，DOWN同样也不进位。

ROUND_CEILING 和 ROUND_FLOOR：CEILING倾向正无穷不进位，FLOOR即使没有超过5，但是为了总是变得更小进了一位。

ROUND_UP 和 ROUND_DOWN：UP始终进位，DOWN始终不会进位。。

from decimal import *

x = Decimal('3.333333333') + Decimal('2.222222222')
print(x)   # 5.555555555
print(x.quantize(Decimal('1.0000'), ROUND_HALF_EVEN))    # 5.5556
print(x.quantize(Decimal('1.0000'), ROUND_HALF_DOWN))    # 5.5556
print(x.quantize(Decimal('1.0000'), ROUND_CEILING))      # 5.5556
print(x.quantize(Decimal('1.0000'), ROUND_FLOOR))        # 5.5555
print(x.quantize(Decimal('1.0000'), ROUND_UP))           # 5.5556
print(x.quantize(Decimal('1.0000'), ROUND_DOWN))         # 5.5555

ROUND_HALF_EVENT 和 ROUND_HALF_DOWN：EVENT是quansize的默认设置值，可以通过getcontext()得到，EVENT由于达到四舍五入所以进位，DOWN同样进位。

ROUND_CEILING 和 ROUND_FLOOR：CEILING正数始终进位，FLOOR在正数则始终不会进位。

ROUND_UP 和 ROUND_DOWN：UP始终进位，DOWN始终不会进位。

from decimal import *

x = Decimal('3.333333333') + Decimal('1.111111111')
print(x)   # 4.444444444
print(x.quantize(Decimal('1.0000'), ROUND_HALF_EVEN))    # 4.4444
print(x.quantize(Decimal('1.0000'), ROUND_HALF_DOWN))    # 4.4444
print(x.quantize(Decimal('1.0000'), ROUND_CEILING))      # 4.4445
print(x.quantize(Decimal('1.0000'), ROUND_FLOOR))        # 4.4444
print(x.quantize(Decimal('1.0000'), ROUND_UP))           # 4.4445
print(x.quantize(Decimal('1.0000'), ROUND_DOWN))         # 4.4444

ROUND_HALF_EVENT 和 ROUND_HALF_DOWN：EVENT是quansize的默认设置值，可以通过getcontext()得到，EVENT由于没有达到四舍五入所以不进位，DOWN同样不进位。

ROUND_CEILING 和 ROUND_FLOOR：CEILING正数始终进位，FLOOR在正数则始终不会进位。

ROUND_UP 和 ROUND_DOWN：UP始终进位，DOWN始终不会进位。

• 13
点赞
• 1
评论
• 52
收藏
• 一键三连
• 扫一扫，分享海报

04-10 1597

11-05 5094
10-28 3万+
09-22

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。