我期待 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精度?
引用文档(重点是我的)-
如果 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)