Python Decimal 不接受 getcontext() 精度修改



只是尝试基本的python十进制模块,它似乎不起作用(在jupyter笔记本中(:

from decimal import *
getcontext().prec = 1
getcontext()

返回Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])

Decimal(0.111111)

返回Decimal('0.11111100000000000143085543413690174929797649383544921875')

知道发生了什么吗?

它看起来像一个错误。

更新:这应该在 2021 年 4 月发布的 ipython 6.0+ 中修复。以下是修复的特定 PR: https://github.com/ipython/ipykernel/pull/632

如果您使用 pip 或jupyter --version检查已安装的版本,您正在寻找的特定库是ipykernel>= 6.0

*编辑:行为似乎因版本而异。最可靠的解决方法应该是在需要应用它的每个单元格中定义十进制精度,或者将精度定义移动到外部模块。

我已经做了一些故障排除,这是我发现的*:

  • 如果您刚刚启动 Jupyter,getcontext().prec = x行为正常。
  • 如果使用"运行">"运行所有单元格",则行为也是正常的。
  • 如果在 Jupyter UI 中重新启动内核,则在手动单元执行之间精度将重置为 28。

我已经向 Jupyter 提交了一个错误 - https://github.com/jupyter/notebook/issues/5260

作为一种简单但丑陋的解决方法,在要应用该精度的每个单元格中定义getcontext().prec = 1似乎迫使 Jupyter 使用它。

或者 - 这很奇怪 - 在任何单元格中运行此命令似乎可以在运行后修复整个笔记本的精度。把它放在你的nb的顶部,你应该很好:

!jupyter notebook --version

最后,导入的模块应正常运行。如果你走这条路,我可能会建议使用"nbdev"包来简化从笔记本创建模块的过程 - 它比从笔记本复制/粘贴更容易保持井井有条。

最新更新