【问题标题】:Format Python Decimal object to a specified precision将 Python Decimal 对象格式化为指定的精度
【发布时间】:2013-02-25 20:54:25
【问题描述】:

我花了无数时间研究、阅读、测试,最终对 Python 的 Decimal 对象缺乏最基本的概念感到困惑和沮丧:将 Decimal 的输出格式化为字符串。

假设我们有一些具有以下值的字符串或 Decimal 对象:

   0.0008
  11.1111
 222.2222
3333.3333
1234.5678

目标是简单地将 Decimal 的精度设置为小数点后第二位。例如,11.1111 将被格式化为 11.111234.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 转换为 float 以输出其值不感兴趣。 Decimal 背后的全部原因是避免在浮点数上存储和运行计算。

还有哪些其他解决方案?我知道关于堆栈溢出还有许多其他类似的问题,但我发现没有一个可以解决我所询问的根本问题。

非常感谢!

【问题讨论】:

    标签: python python-2.7 python-3.x decimal


    【解决方案1】:

    只需使用string formattingformat() function

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

    decimal.Decimal 支持与浮点数相同的format specifications,因此您可以根据需要使用指数、定点、通用、数字或百分比格式。

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

    【讨论】:

    • 是否没有内置的十进制接口来处理输出格式或十进制精度?
    • @JoshuaBurns:这用于输出格式化的内置接口。
    • 这绝对回答了我的问题,非常感谢!我最担心的是 format() 在执行实际格式之前将值转换为浮点数。
    【解决方案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 中不可用。

    【讨论】:

    • python中不能直接比较Float和Decimal有什么原因吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多