python-2.7 - Python 十进制() | 十进制.InvalidOperation
问题描述
我想克服从 python 2 迁移到 3 时遇到的 Decimal 问题。
蟒蛇 2.7:
>>> Decimal('333').quantize(Decimal('.01'), rounding=decimal.ROUND_HALF_DOWN)
Decimal('333.00')
蟒蛇 3.7:
>>> Decimal('333').quantize(Decimal('.01'), rounding=decimal.ROUND_HALF_DOWN)
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
如示例所示,这些 python 版本之间存在行为变化。
我错过了什么吗?
欢迎任何见解。
解决方案
decimal.get_context().prec
当低于您的预期回合时,此附加
例子:
In [3]: from decimal import Decimal
In [4]: Decimal('333').quantize(Decimal('.01'), rounding=decimal.ROUND_HALF_DOWN)
Out[4]: Decimal('333.00')
In [5]: decimal.getcontext()
Out[5]: Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
In [6]: round(Decimal('333'), 2)
Out[6]: Decimal('333.00')
但如果你这样做:
import decimal
In [11]: context = decimal.getcontext()
In [12]: context.prec = 1
In [13]: decimal.setcontext(context)
In [15]: Decimal('333').quantize(Decimal('.01'), rounding=decimal.ROUND_HALF_DOWN)
---------------------------------------------------------------------------
InvalidOperation Traceback (most recent call last)
<ipython-input-15-24094f7b9eb1> in <module>
----> 1 Decimal('333').quantize(Decimal('.01'), rounding=decimal.ROUND_HALF_DOWN)
InvalidOperation: [<class 'decimal.InvalidOperation'>]
所以请记住,您的 context.precision 需要大于或等于您的舍入需求
推荐阅读
- php - 在后台模式下运行 bash 脚本时的编码问题
- json - 通过 Snowflake 中的目标表替代 JSON 展平
- c# - Access 数据库应用程序可以跨桌面共享吗?
- javascript - 使用 ElementRef 查询列表在悬停时显示 div
- xml - 由两种模式验证的 XML 文件
- android - 在Android中找不到资产的路径
- r - R Studio - 包 googlesheets 不再起作用
- jekyll - 有没有一种简单的方法可以让 Jekyll 输出文件到 docs/ 目录?
- android - 如何正确监听 FirebaseDatabase 中的子更改
- php - 在 Laravel 6.5 中手动添加旧的东西