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

5

我刚试用了基本的Python Decimal模块,但在Jupyter Notebook中好像无法正常工作:

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')

有什么想法吗?


prec 设置仅适用于计算结果。那个很长的数字实际上是 0.111111 的实际值(这个数字没有精确的浮点表示)。请改用 Decimal('0.111111') 来指定一个精确的数字。 - jasonharper
@jasonharper 非常感谢!但是当我执行 getcontext() 时,为什么它仍然显示 Context(prec=28?它不应该显示 Context(prec=1 吗? - jim jarnac
1
遇到了完全相同的问题。已接受的解决方案对我无效。除了在每个相关单元格中添加 getcontext.prec = n 之外,还有其他建议吗? - zerosofthezeta
对我来说,接受的解决方案也没有任何效果,因为get.context()仍然显示精度为28。尽管在Python命令行中直接运行相同的代码时未出现此问题。 - BOT_bkcd
@jimbasquiat,你最终解决了这个问题还是仍然存在?问这个问题是因为我也遇到了同样的问题。 - BOT_bkcd
我认为我从未正确地使其工作。虽然我跳过了笔记本研究步骤,但在普通的.py文件中这个可以正常工作。 - jim jarnac
1个回答

2

看起来像是一个bug。

更新:这个问题应该在ipython 6.0+中得到解决,该版本于2021年4月发布。以下是修复的具体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”包的东西来简化从笔记本创建模块的过程-这使得保持组织比从笔记本复制/粘贴更容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接