2013-02-25 3 views
13

PythonのDecimalオブジェクトで最も基本的な概念が不足しているため、研究、読み込み、テスト、そして最終的には混乱し、心配しています。フォーマットPython Decimalオブジェクトを指定された精度に変換する

のは、我々は次の値を持ついくつかの文字列または小数のオブジェクトを持っていると仮定しましょう:

0.0008 
    11.1111 
222.2222 
3333.3333 
1234.5678 

目標は、単に小数点以下第三位を小数の精度を設定することです。たとえば、11.111111.111234.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 

これを考慮にTOTALがかかるため、明らかに、我々は、小数のコンテキストの精度を利用することはできません小数点以下の桁数です。

また、Decimalを浮動小数点に変換してその値を出力することにも興味はありません。 Decimalの背後にある理由は、浮動小数点数の計算の保存と実行を避けるためです。

その他の解決策はありますか?私は、スタックのオーバーフローに関する他の同様の質問があることを理解していますが、それらのどれも私が調べている根本的な問題を解決することはできませんでした。

ありがとうございます!

答えて

22

だけstring formattingを使用するか、format() function:必要に応じてあなたが指数、固定小数点、一般的な、数またはパーセントの書式設定を使用できるように

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

decimal.Decimalは、山車がそうであるように同じformat specificationsをサポートしています。

これは、小数点以下を整形する公式で非凡な方法です。 Decimalクラスは、このような書式設定を効率的に処理するために.__format__()メソッドを実装しています。

+0

出力フォーマットや10進精度を扱うための組み込み10進インターフェイスはありませんか? –

+3

@JoshuaBurns:これは*出力フォーマット用の組み込みインターフェースです。 –

+2

これは間違いなく私の質問に答える、ありがとう!私の最大の関心事は、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()は、私たちの正規のBipedで使用されることを意味しない、それは、Python 2.7で動作し、3.4では利用できません。

+0

PythonでFloatとDecimalを直接比較することができない理由はありますか? –

関連する問題