How to create a decimal.Decimal object with a given number of significant figures?

浪尽此生 提交于 2019-12-12 20:23:05

问题


The best way I've found to produce a decimal.Decimal number with a specific number of significant figures is the one used to initialize the variable kluge below:

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')

The first line of output shows the desired decimal.Decimal number, with 5 significant figures. The second line in the output shows what happens if one does not add the

+ decimal.Decimal(0)

to the RHS of the initialization; without it, the result has unwanted and unhelpful excess precision.

Even without the + decimal.Decimal(0) hack, the code strikes me as more verbose than it needs to be.

What's the correct approach to creating a Decimal with a desired number of significant figures?


This question is not a duplicate of Format Python Decimal object to a specified precision. Look at the output below.

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')

The items shown in the output above cannot be obtained using the method given in the answer to Format Python Decimal object to a specified precision, simply because this question has nothing to do with formatting output.

This question is about how to use a specific module (decimal) to create certain objects of a class defined by that module. More specifically, it is about looking for a way to use the decimal module to achieve the result shown without having to resort to adding decimal.Decimal(0).


回答1:


You seem to be looking for Context.create_decimal:

Creates a new Decimal instance from num but using self as context. Unlike the Decimal constructor, the context precision, rounding method, flags, and traps are applied to the conversion.

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


来源:https://stackoverflow.com/questions/33948218/how-to-create-a-decimal-decimal-object-with-a-given-number-of-significant-figure

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!