格式的Python十进制对象到一个指定的精度(Format Python Decimal objec

2019-07-20 12:07发布

我花了无数个小时的研究,阅读测试,并最终困惑和沮丧在Python的十进制对象缺乏最根本的概念:格式化十进制输出为字符串。

假设我们有一些字符串或者与下面的值小数对象:

   0.0008
  11.1111
 222.2222
3333.3333
1234.5678

我们的目标是简单地将小数的精度设置为小数点后第二位。 例如, 11.1111将被格式化为11.11 ,和1234.56781234.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

显然,我们不能使用的十进制的上下文的精度,因为这考虑到总人数的数字,不只是小数精度。

我也没有兴趣在十进制转换为浮动输出其价值。 背后十进制整个原因是为了避免存储和彩车上运行计算。

有什么其他的解决方案有哪些? 据我所知,在堆栈溢出许多其他类似的问题,但他们都没有我发现解决我询问的根本问题。

非常感谢!

Answer 1:

只要使用字符串格式化或format()函数 :

>>> for dec in decimals:
...    print format(dec, '7.2f')
... 
   0.00
  11.11
 222.22
3333.33
1234.57

decimal.Decimal支持相同的格式规范为花车做,所以你可以使用指数,定点,一般情况下,数量或百分比的格式需要。

这是格式化小数的官方和Python的方法; 的Decimal类实现.__format__()方法来有效地处理这样的格式。



Answer 2:

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()并不意味着被我们利用普通的两足动物,它在Python 2.7的作品,是不是在3.4可用。



文章来源: Format Python Decimal object to a specified precision