我花了无数的时间研究、阅读和测试,最终对Python的Decimal对象缺乏最基本的概念感到困惑和沮丧:将Decimal的输出格式化为字符串。
让我们假设我们有一些字符串或Decimal对象,它们具有以下值:
0.0008
11.1111
222.2222
3333.3333
1234.5678这样做的目的是简单地将decimal的精度设置为第二位小数。例如,11.1111将格式化为11.11,1234.5678将格式化为1234.57。
我设想的代码类似于以下代码:
import decimal
decimals = [
decimal.Decimal('0.0008'),
decimal.Decimal('11.1111'),
decimal.Decimal('222.2222'),
decimal.Decimal('3333.3333'),
decimal.Decimal('1234.5678'),
]
for dec in decimals:
print dec.as_string(precision=2, rounding=ROUND_HALF_UP)生成的输出将是:
0.00
11.11
222.22
3333.33
1234.57显然,我们不能利用decimal上下文的精度,因为这考虑到了总的位数,而不仅仅是小数精度。
我对将Decimal转换为浮点数以输出值也不感兴趣。Decimal背后的全部原因是为了避免在浮点数上存储和运行计算。
还有其他的解决方案吗?我知道还有许多其他类似的堆栈溢出问题,但我发现这些问题都不能解决我正在询问的潜在问题。
非常感谢!
发布于 2013-02-26 04:56:39
只需使用string formatting或format() function
>>> for dec in decimals:
... print format(dec, '7.2f')
...
0.00
11.11
222.22
3333.33
1234.57decimal.Decimal支持与浮点数相同的format specifications,因此您可以根据需要使用指数、定点、通用、数字或百分比格式。
这是设置小数格式的官方和pythonic方法;Decimal类实现了.__format__()方法来有效地处理这种格式设置。
发布于 2014-03-13 14:29:08
def d(_in, decimal_places = 3):
''' Convert number to Decimal and do rounding, for doing calculations
Examples:
46.18271 to 46.183 rounded up
46.18749 to 46.187 rounded down
117.34999999999999 to 117.350
_rescale is a private function, bad practice yet works for now.
'''
return Decimal(_in)._rescale(-decimal_places, 'ROUND_HALF_EVEN')编辑:再说一次,_rescale()不是我们普通的bipeds使用的,它在Python2.7中工作,在3.4中不可用。
https://stackoverflow.com/questions/15076310
复制相似问题