如何强制 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
我需要格式化一个 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