如何强制python Decimal至少有两个小数?



我需要格式化一个python Decimal对象,使其至少有两个小数,但不超过5。是否有可靠的方法来做到这一点?例子:

1.6 --> 1.60
1.678 --> 1.678
1.98765 --> 1.98765

如果有两个以上的小数,重要的是它不被截断到只有两个小数。

在我看来,这个问题有两部分——一是确定正确的数字数,二是将数值量化到那个数字数。

要执行第一个操作,我将使用as_tuple()方法获得当前指数。除非我忽略了一些更简单的东西。

>>> import decimal
>>> d = decimal.Decimal("1.678")
>>> d.as_tuple().exponent
-3
>>> d2 = decimal.Decimal("1.6")
>>> d2.as_tuple().exponent
-1

由此可以计算所需的指数:

MAX_EXPONENT = -2
MIN_EXPONENT = -5
def desired_exponent(d):
current_exponent = d.as_tuple().exponent
return min(MAX_EXPONENT, max(MIN_EXPONENT, current_exponent))

第二个由标记副本上的可接受答案回答-使用quantize()方法。您需要构造一个Decimal值,该值可以作为quantize()的参数提供所需的指数。有多种方法可以做到这一点,但有两种简单的方法是对decimal.Decimal("10")进行幂运算或对decimal.Decimal()使用tuple构造函数。

>>> quant_arg = decimal.Decimal("10") ** -2
>>> decimal.Decimal("1.6").quantize(quant_arg)
Decimal('1.60')

或:

>>> quant_arg = decimal.Decimal((0, (), -2))
>>> decimal.Decimal("1.6").quantize(quant_arg)
Decimal('1.60')

我在这里使用-2作为字面量,您需要使用desired_exponent的计算值。

有多种方法来组织这段代码,我认为不明显的部分是a)访问十进制值的当前指数和b)为quantize()构造arg的一些方法。这一切都是假设您需要实际的十进制对象,而不仅仅是输出它们-如果这是一个关于输出格式的问题,重新量化可能是多余的。

下面是我现在使用的代码:

def unitAmount(value):
"""Format a Decimal to match -?[0-9]{1,15}(,[0-9]{2,5})?
Minimum two decimals, max 5.
"""
decimals = value.as_tuple().exponent
if decimals == -1:  # For values like 1.6 --> 1.60
value = value.quantize(Decimal('1.00'))
elif decimals < -5:  # For values like 1.1234567.. --> 1.12345
value = value.quantize(Decimal('1.00000'))
return value