从浮点文字构造时出现奇怪的十进制行为

dan*_*ast 1 python decimal

我期待 2 位小数精度,但是:

>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 2
>>> Decimal(98791.4913)
Decimal('98791.491299999994225800037384033203125')
>>> getcontext()
Context(prec=2, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
Run Code Online (Sandbox Code Playgroud)

为什么不Decimal尊重Context精度?

Ana*_*mar 5

引用文档(重点是我的)-

如果 value 是浮点数,则二进制浮点值将无损转换为其精确的十进制等值。此转换通常需要 53 位或更多位的精度。例如,Decimal(float('1.1')) 转换为 Decimal('1.100000000000000088817841970012523233890533447265625')。

上下文精度不影响存储的数字数量。这完全由值的位数决定。例如,Decimal('3.00000') 记录所有五个零,即使上下文精度仅为 3。

上下文参数的目的是确定如果值是格式错误的字符串该怎么办。如果上下文捕获 InvalidOperation,则会引发异常;否则,构造函数返回一个新的 Decimal,其值为 NaN。

来自相同的文档-

新小数的重要性仅由输入的位数决定。上下文精度和舍入仅在算术运算期间发挥作用。

文档中给出了很好的例子 -

>>> getcontext().prec = 6
>>> Decimal('3.0')
Decimal('3.0')
>>> Decimal('3.1415926535')
Decimal('3.1415926535')
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
>>> getcontext().rounding = ROUND_UP
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')
Run Code Online (Sandbox Code Playgroud)