Python 小数精度

6 投票
1 回答
4700 浏览
提问于 2025-04-16 20:18

出于某种原因,Decimal对象在相乘时会失去精度。这本来不应该发生。请检查一下测试案例,给我点启发。

from decimal import *
getcontext().prec = 11

a = Decimal('5085.28725881485')
b = 1

print getcontext()
print 'a     = '+str(a)
print 'b     = '+str(b)
print 'a * b = '+str(a * b)

这是输出结果:

Context(prec=11, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, flags=[], traps=[DivisionByZero, InvalidOperation, Overflow])
a     = 5085.28725881485
b     = 1
a * b = 5085.2872588

不确定这是否相关,但我使用的是python2.6。

1 个回答

12

你在上下文中指定的精度(11位小数)只在进行计算时生效,而不是在创建decimal.Decimal对象的时候。结果5085.2872588确实遵循了这个限制。使用1作为乘数并不会改变精度的规则;算术运算的结果总是会考虑到精度。

如果你想要decimal.Decimal返回一个四舍五入到特定小数位的数字,可以使用上下文对象的create_decimal方法来实现。

撰写回答