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

How do I force a python Decimal to have atleast two decimals?

我需要格式化一个 python 小数对象,使其至少有两位小数,但不超过 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))

第二个由 the accepted answer 在标记的重复项上回答 - 使用 quantize() 方法。您需要构造一个 Decimal 值,其中包含您可以提供的所需指数作为 quantize() 的参数。有多种方法可以做到这一点,但两个简单的方法是对 decimal.Decimal("10") 求幂或使用 tuple 构造函数 decimal.Decimal().

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