web-dev-qa-db-ja.com

お金の表現に使用するクラスは何ですか?

ほとんどの丸め誤差を回避するために、お金の表現にどのクラスを使用する必要がありますか?

Decimalを使用する必要がありますか、それとも単純な組み込みのnumberを使用する必要がありますか?

使用できる通貨換算をサポートする既存のMoneyクラスはありますか?

避けるべき落とし穴はありますか?

25
Esteban Küber

あなたがPythonについて話していると思います。 http://code.google.com/p/python-money/ "Pythonでお金と通貨を操作するためのプリミティブ"-タイトルは自明です:)

8
juckobee

お金を表すために浮動小数点数を使用しないでください。浮動小数点数は、10進表記の数を正確に表していません。複合丸め誤差の悪夢で終わり、通貨間で確実に変換できなくなります。 この主題に関するMartin Fowlerの短いエッセイ を参照してください。

独自のクラスを作成する場合は、 decimal データ型に基づいて作成することをお勧めします。

Python-moneyはかなり長い間維持されておらず、そのソースコードには奇妙で役に立たないコードがあり、通貨の交換が単純に壊れているため、python-moneyは良い選択肢ではないと思います。

py-moneyed を試してください。これは、python-moneyよりも改善されています。

16
Thiago Chaves

decimal を使用してください。

12
S.Lott

あなたは QuantLib 金融で働くことに興味があるかもしれません。

通貨タイプを処理するためのクラスが組み込まれており、4年間の活発な開発を主張しています。

4
Jon W

このライブラリを見ることができます: python-money 。私はそれを使った経験がないので、その有用性についてコメントすることはできません。

通貨を整数として処理するために使用できる「トリック」:

  • 100を掛ける/ 100で割る(例:$ 100,25-> 10025)「セント」で表現する
4
ChristopheD

シンプルで軽量でありながら拡張可能なアイデア:

class Money():

    def __init__(self, value):
        # internally use Decimal or cents as long
        self._cents = long(0)
        # Now parse 'value' as needed e.g. locale-specific user-entered string, cents, Money, etc.
        # Decimal helps in conversion

    def as_my_app_specific_protocol(self):
        # some application-specific representation

    def __str__(self):
        # user-friendly form, locale specific if needed

    # rich comparison and basic arithmetics
    def __lt__(self, other):
        return self._cents < Money(other)._cents
    def __add__(self, other):
        return Money(self._cents + Money(other)._cents)

あなたはできる:

  • アプリケーションに必要なものだけを実装します。
  • あなたが成長するにつれてそれを拡張します。
  • 必要に応じて、内部表現と実装を変更します。
1
andruso