お金の表現に使用するクラスは何ですか?
-
05-07-2019 - |
質問
ほとんどの丸めエラーを回避するために、お金の表現にどのクラスを使用する必要がありますか?
Decimal
を使用するべきですか、それとも簡単な組み込みの number
を使用するべきですか?
通貨変換をサポートする既存の Money
クラスはありますか?
避けるべき落とし穴はありますか?
解決
あなたはPythonについて話していると思います。 http://code.google.com/p/python-money/ " Pythonでお金と通貨を操作するためのプリミティブ" -タイトルは自明です:)
他のヒント
お金を表すために浮動小数点数を使用しないでください。浮動小数点数は、10進表記の数値を正確に表しません。複合丸め誤差の悪夢で終わり、通貨間の信頼性の高い変換ができなくなります。 Martin Fowlerの主題に関する短いエッセイを参照してください。
独自のクラスを作成する場合は、に基づいて作成することをお勧めしますdecimal データ型。
python-moneyは長い間維持されておらず、そのソースコードには奇妙で役に立たないコードがあり、通貨の交換は単純に壊れているため、python-moneyは良い選択肢ではないと思います。
py-moneyed をお試しください。 python-moneyよりも改善されています。
10進数を使用するだけです。
金融を扱うための QuantLib に興味があるかもしれません。
通貨タイプを処理するためのクラスが組み込まれており、4年間の積極的な開発を主張しています。
次のライブラリをご覧ください: python-money 。経験がないので、その有用性についてコメントすることはできません。
通貨を整数として処理するために使用できる「トリック」:
- 100で乗算/ 100で除算(例:$ 100,25-> 10025)して、「セント」で表現します
シンプルで軽量、しかも拡張可能なアイデア:
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)
次のことができます:
- アプリケーションで必要なものだけを実装します。
- 成長するにつれて拡張します。
- 必要に応じて内部表現と実装を変更します。