【发布时间】:2015-11-26 23:06:55
【问题描述】:
我发现生成具有特定数量significant figures 的decimal.Decimal 数字的最佳方法是用于初始化下面的变量kluge:
import decimal
THIS_IS_JUST_AN_EXAMPLE = 0.00001/3.0
with decimal.localcontext() as c:
c.prec = 5
kluge = decimal.Decimal(THIS_IS_JUST_AN_EXAMPLE) + decimal.Decimal(0)
naive = decimal.Decimal(THIS_IS_JUST_AN_EXAMPLE)
print repr(kluge)
print repr(naive)
# Decimal('0.0000033333')
# Decimal('0.00000333333333333333374718233758915442166426146286539733409881591796875')
输出的第一行显示所需的decimal.Decimal 数字,有 5 个有效数字。输出中的第二行显示了如果不添加会发生什么
+ decimal.Decimal(0)
到初始化的RHS;没有它,结果就会出现不必要且无用的过度精度。
即使没有+ decimal.Decimal(0) hack,代码也让我觉得比它需要的更冗长。
创建具有所需有效数字数量的Decimal 的正确方法是什么?
此问题与Format Python Decimal object to a specified precision 不重复。看看下面的输出。
import math
import decimal
base = math.pi
with decimal.localcontext() as c:
c.prec = 13
for exponent in [6, 4, 2, 0, -2, -4, -6]:
scale = 10**exponent
kluge = decimal.Decimal(base * scale) + decimal.Decimal(0)
print repr(kluge)
# Decimal('3141592.653590')
# Decimal('31415.92653590')
# Decimal('314.1592653590')
# Decimal('3.141592653590')
# Decimal('0.03141592653590')
# Decimal('0.0003141592653590')
# Decimal('0.000003141592653590')
使用Format Python Decimal object to a specified precision的答案中给出的方法无法获取上面输出中显示的项目,只是因为这个问题与格式化输出无关。
这个问题是关于如何使用特定模块 (decimal) 来创建由该模块定义的类的某些对象。更具体地说,它是关于寻找一种方法来使用decimal 模块来实现显示的结果,而不必求助于添加decimal.Decimal(0)。
【问题讨论】:
标签: python decimal ieee-754 significant-digits