【问题标题】:How to create a decimal.Decimal object with a given number of significant figures?如何创建具有给定有效数字数的 decimal.Decimal 对象?
【发布时间】:2015-11-26 23:06:55
【问题描述】:

我发现生成具有特定数量significant figuresdecimal.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


    【解决方案1】:

    你好像在找Context.create_decimal

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

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

    【讨论】:

    • 谢谢。我最初接受了这个答案,但后来我发现了这种方法无法产生正确数量的有效数字的输入(一点也不罕见)。 (stackoverflow.com/questions/34211451/possible-bug-in-decimal)
    • @kjo:哦,嘿,你和另一个问题的人是同一个人。我没有注意到。如果你想要尾随零,你可以得到它们,但这开始看起来更像是一个应该在显示逻辑而不是内部表示中处理的问题。由于您特别强调这不是显示问题,因此我将此解释为关于舍入的问题,其中尾随零并不重要。你需要尾随零做什么?
    • 尾随零遵循“重要数字”的定义。令我惊讶的是,我开始意识到 Python 对“重要数字”的概念一无所知......
    • @kjo:Sigfigs 通常不是在计算机上进行计算的最佳方式。 decimal 将在有限的程度上跟踪它们,但你不会像手工做 sigfigs 那样从 decimal 中得到像 1.20 + 0.02234 == 1.22 这样的东西。我可以用 quantize 给你一个 hacky 东西,让你的尾随零,但如果你想让小数遵循 sigfig 规则,你只会遇到更多问题。
    猜你喜欢
    • 2019-12-28
    • 2022-01-24
    • 2013-08-21
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2022-01-07
    • 2012-06-27
    相关资源
    最近更新 更多