15

ほとんどの丸め誤差を避けるために、お金の表記にどのようなクラスを使用しますか?お金の表記にはどのようなクラスを使用しますか?

Decimalを使用するか、またはnumberを組み込む必要がありますか?

使用可能な通貨換算をサポートする既存のMoneyクラスがありますか?

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

+0

いつも私は通貨換算が単なる乗算であると思っていました。 – SilentGhost

+2

@SilentGhost:はい、いいえ。あなたはあなたが持っている値をどのように使うのかを心に留めておく必要があります。あなたは昨年U $ S2000 + AR $ 6300 +€1500を支払ったときにどうしましたか?今年あなたはU $ S4000 + AR $ 1200 +€500を支払ったのですか?あなたが考慮しなければならないことがたくさんあるので、 'Money'オブジェクトは履歴値*と*現在の値を保存する必要があります。 – voyager

+3

回避すべき落とし穴:浮動小数点数の使用。 Office Spaceを参照してください。 –

答えて

6

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

+1

それは何のためのタグです:) – voyager

+0

http://code.google.com/p/python-money/source/browse/trunk/money/Money.pyを見ると、彼らは 'Decimal'を内部表現:) – voyager

4

ファイナンスをご利用の場合は、QuantLibに興味があります。

通貨の種類を処理するクラスが組み込まれており、4年間の積極的な開発を主張しています。

+0

このプロジェクトは興味深いようですが、多すぎるかもしれませんが、わかりやすくするために純粋なpythonプロジェクトを使用しています。 – voyager

3

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

A 'トリック' あなたは整数として通貨を処理するために採用することができます:100(例えば$ 100,25 - > 10025)によって100 /除算によって

  • 乗算をでの表現を持っている 'セント'
+5

多くの会計システムは、セントよりもはるかに正確に物事を追跡します。 –

+0

真実だが、すべてが私の思うニーズに依存している...このスレッドで参照されているquantlibライブラリは、「真剣な」財務的な仕事の良い候補のようだ。 – ChristopheD

8

だけdecimalを使用しています。

+1

精度を扱う方法のため、10進数は適切ではありません。 100万ドル未満の金額を0.01ドルの精度で処理していると仮定すると、小数点以下のライブラリには12桁を超えない数値を指定します。今では2つの問題があります:あなたのコードはハイパーインフレーションを処理できません。 0.01ドルは「0.010000000000」と表示されます。 – Pitarou

9

金銭を表すために浮動小数点数を使用しないでください。浮動小数点数は十進表記の数字を正確に表していません。あなたは複合丸め誤差の悪夢で終わり、確実に通貨間の変換はできません。 Martin Fowler's short essay on the subjectを参照してください。

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

python-moneyは、かなりの期間保守されておらず、ソースコードに奇妙で無用なコードがあり、通貨の交換が簡単でないため、良い選択だとは思わない。

Try py-moneyedこれはpython-moneyよりも改善されています。

0

シンプル、軽量、まだ拡張可能なアイデア:

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) 

次のことが可能です。

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