gpt4 book ai didi

python - 缩放小数时如何保持精度?

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:08 24 4
gpt4 key购买 nike

如何扩展 Decimal ,但保持其原始精度?例如,

>>> from decimal import Decimal
>>> Decimal('0.1230')
Decimal('0.1230') # Precision is 4.

乘法不保留原始精度:

>>> Decimal('0.1230') * 100
Decimal('12.3000') # Precision is 6.
>>> Decimal('0.1230') * Decimal('100')
Decimal('12.3000') # Precision is 6.

.shift()方法仅在移位负数时保留相同的小数位数:

>>> Decimal('0.1230').shift(2)
Decimal('12.3000') # Precision is 6.
>>> Decimal('0.1230').shift(-2)
Decimal('0.0012') # Precision is 2.

最佳答案

使用setcontext :

>>> mycontext=decimal.Context(prec=4)
>>> decimal.setcontext(mycontext)
>>> decimal.Decimal('0.1230')*decimal.Decimal('100')
Decimal('12.30')

如果您想要感觉更本地化的东西,请使用 localcontext和上下文:

import decimal as dec

with dec.localcontext() as ctx:
ctx.prec=4
d1=dec.Decimal('0.1230')*100

d2=dec.Decimal('0.1230')*100

>>> d1, d2
12.30 12.3000

如果您想要较低精度的表示形式(没有十进制整数使用默认值),您可以执行以下操作:

def muld(s1, s2, dprec=40):
with dec.localcontext() as ctx:
d1=dec.Decimal(s1)
d2=dec.Decimal(s2)
p1=dprec if '.' not in s1 else len(d1.as_tuple().digits)
p2=dprec if '.' not in s2 else len(d2.as_tuple().digits)
ctx.prec=min(p1, p2)
return d1*d2

>>> muld('0.1230', '100')
12.30
>>> muld('0.1230', '1.0')
0.12

关于python - 缩放小数时如何保持精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39919432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com