python - Python Decimal 不接受 getcontext() 精度修改
问题描述
只是尝试基本的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')
知道发生了什么吗?
解决方案
它看起来像一个错误。
更新:这应该在 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”的包来简化从笔记本创建模块的过程——它比从笔记本复制/粘贴更容易保持井井有条。
推荐阅读
- python - Script to wait till a specified time
- flutter - 使用 MobX 在 Flutter 中处理关系数据
- rest - REST API - 更新实体之间的关系
- r - 在R中组合直方图条
- mips - 有没有办法将整数转换为数组(即 45 -> array[0] = 5 ; array [1] = 4)?
- javascript - 反应:material-ui-pickers date-io Jalaali Utils 返回错误:TypeError:utils.getDayText 不是函数
- javascript - Node.js 中的类型错误
- flutter - 使用多个文档从颤动中更新 Firestore 字段
- php - 在函数中访问 $pdo
- python - 用户写“exit”时如何退出程序?