2013-02-25 42 views
13

我已經花了無數小時研究,閱讀,測試並最終困惑於Python的Decimal對象缺乏最基本概念的問題:將Decimal的輸出格式化爲字符串。將Python十進制對象格式化爲指定的精度

假設我們有一些字符串或者與下面的值對象十進制:

0.0008 
    11.1111 
222.2222 
3333.3333 
1234.5678 

我們的目標是簡單地將小數的精度設置爲小數點後第二位。例如,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 

顯然,我們不能使用的十進制的上下文的精度,因爲這考慮了TOTAL數字的數量,而不僅僅是小數精度。

我也沒有興趣將Decimal轉換爲浮點數來輸出它的值。 Decimal背後的全部原因是爲了避免在浮點上存儲和運行計算。

還有哪些其他解決方案?我知道還有很多關於堆棧溢出的其他類似問題,但是我沒有發現它們可以解決我詢問的潛在問題。

非常感謝!

回答

22

只需使用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__()方法來有效地處理這種格式。

+0

有沒有內置的十進制接口來處理輸出格式或小數精度? – 2013-02-25 21:06:37

+3

@JoshuaBurns:這是用於輸出格式的內置接口。 – 2013-02-25 21:08:03

+2

肯定回答我的問題,非常感謝!我最擔心的是格式()在執行實際格式之前將值轉換爲浮點數。 – 2013-02-25 21:13:09

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可用。

+0

是不是有可能直接比較Python中的Float和Decimal的原因? – 2014-05-05 01:08:16

相關問題