如何使用给定数量的有效数字创建decimal.Decimal对象?

时间:2015-11-26 23:06:56

标签: python decimal ieee-754 significant-digits

我发现生成具有特定数量的 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)黑客攻击,代码也会让我觉得比它需要的更详细。

创建具有所需有效数字的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)

1 个答案:

答案 0 :(得分:3)

您似乎在寻找Context.create_decimal

  

num 创建一个新的Decimal实例,但使用 self 作为上下文。   与Decimal构造函数不同,上下文精度,舍入   方法,标志和陷阱应用于转换。

>>> decimal.Context(prec=5).create_decimal(0.00001/3.0)
Decimal('0.0000033333')