15

반올림 오류를 방지하기 위해 돈을 표시하는 데 사용해야하는 클래스는 무엇입니까?돈을 대표하는 데 사용할 클래스는 무엇입니까?

Decimal 또는 간단한 내장형 number을 사용해야합니까?

사용할 수있는 통화 변환을 지원하는 기존 Money 클래스가 있습니까?

나는 피해야 할 함정이 있습니까?

+0

나는 항상 통화 변환이 곱셈이라고 생각했습니다. – SilentGhost

+2

@SilentGhost : 예, 아니오. 당신은 당신이 가지고있는 가치들을 어떻게 사용할 것인지를 명심해야합니다. 작년에 U $ S2000 + AR $ 6300 + € 1500를 지불했을 때 어떻게합니까? 그리고 올해에 U $ S4000 + AR $ 1200 + € 500를 지불 했습니까?여러분이 고려해야 할 많은 것들이 있으므로,'돈'객체는 역사적 가치와 현재 가치를 저장할 필요가 있습니다. – voyager

+3

피할 수있는 피탄 : 부동 소수점 숫자 사용. Office Space를 참조하십시오. –

답변

6

저는 여러분이 파이썬에 대해 이야기한다고 가정합니다. http://code.google.com/p/python-money/ "파이썬에서 돈과 통화 작업을위한 프리미티브"- 제목은 자기 설명 :

+1

그게 무슨 태그가 있습니다 :) – voyager

+0

http://code.google.com/p/python-money/source/browse/trunk/money/Money.py에서 나는 그들이 'Decimal'을 사용하는 것을 볼 수 있습니다. 내부 표현 : – voyager

4

재무 관련 작업에 대한 문의는 QuantLib입니다.

통화 유형을 처리하기위한 클래스가 있으며 4 년간의 적극적인 개발을 주장합니다.

+0

이 프로젝트는 재미있어 보이지만 조금 지나치게 많을 수 있습니다. 단순하게 순수 파이썬 프로젝트를 사용합니다. – voyager

3

이 라이브러리를 살펴볼 수 있습니다 : python-money. 경험이 없으므로 그 유용성에 대해서는 언급 할 수 없습니다.

A '트릭'은 정수로 통화를 처리하기 위해 고용 수 : 100 (예를 들어 $ 100,25 -> 10025) 100/나누기에 의해

  • 곱하기의 표현을 가지고 '센트'
+5

많은 회계 시스템이 센트보다 훨씬 정확하게 물건을 추적합니다. –

+0

사실,하지만 모두 내가 필요로하는 것 같아 ...이 스레드에서 참조 된 quantlib 라이브러리 '심각한'재정적 인 작업에 대한 좋은 후보 것 같습니다. – ChristopheD

8

그냥 decimal를 사용합니다.

+1

십진수는 정밀도를 다루는 방식으로 적합하지 않습니다. 100 만 달러 미만의 금액을 0.01 달러의 정밀도로 처리한다고 가정하면 10 진수 라이브러리에 숫자가 12 자리 이하가 될 것입니다. 이제 두 가지 문제가 있습니다. 코드가 하이퍼 인플레이션을 처리 할 수 ​​없습니다. 0.01 달러는 '0.010000000000'으로 표시됩니다. – Pitarou

9

돈을 나타내는 데 부동 소수점 숫자를 사용하지 마십시오. 부동 숫자는 10 진수 표기법의 숫자를 정확하게 나타내지 않습니다. 당신은 복잡한 반올림 오류의 악몽으로 끝날 것이고, 통화간에 안정적으로 변환 할 수 없습니다. Martin Fowler's short essay on the subject을 참조하십시오.

클래스를 직접 작성하려면 decimal 데이터 유형을 기준으로하는 것이 좋습니다.

python-money는 좋은 옵션이라고 생각하지 않습니다. 왜냐하면 꽤 오랜 기간 동안 유지되지 않았기 때문에 소스 코드에 이상하고 쓸모없는 코드가 있고 통화 교환이 간단 해 졌기 때문입니다.

시도 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) 

할 수 있습니다 :

  • 구현에만 응용 프로그램에서 필요.
  • 성장하면서 확장하십시오.
  • 필요에 따라 내부 표현 및 구현을 변경하십시오.