BigDecimal이 Java에서 화폐 가치를 표현하는 데 권장되는 모범 사례라는 것을 이해합니다. 당신은 무엇을 사용합니까? 대신 사용하고 싶은 더 나은 라이브러리가 있습니까?
BigDecimal이 Java에서 화폐 가치를 표현하는 데 권장되는 모범 사례라는 것을 이해합니다. 당신은 무엇을 사용합니까? 대신 사용하고 싶은 더 나은 라이브러리가 있습니까?
답변:
BigDecimal
모든 방법. 나는 어떤 사람들은 자신의 창조 들었어요 Cash
또는 Money
통화와 현금 가치를 캡슐화 클래스를,하지만 피부 아래 여전히입니다 BigDecimal
아마로, BigDecimal.ROUND_HALF_EVEN
반올림.
편집 : Don이 그의 대답 에서 언급 했듯이 timeandmoney 와 같은 오픈 소스 프로젝트가 있으며 개발자가 바퀴를 재발 명하지 않도록 노력한 것에 대해 박수를 보내지 만 사용할 사전 알파 라이브러리에 대한 확신이 충분하지 않습니다. 프로덕션 환경에서. 게다가, 후드 아래를 파헤 치면 그들이 사용하는 BigDecimal
것을 볼 수 있습니다 .
JodaMoney : http://www.joda.org/joda-money/ 에 대해 알기 위해 검색 엔진을 통해 여기에 도착하는 사람들에게 유용 할 수 있습니다 .
BigDecimal
.
나는 여기에 내 의견을 표현하지 않지만 누군가가 아마도 버려야 할 BigDecimal에 대한 꽤 좋은 주장이 있습니다.
http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money/
앞서 살펴본 편리한 도서관은 Joda-Money 도서관입니다. 구현 중 하나는 실제로 BigDecimal을 기반으로합니다. 통화 에 대한 ISO-4217 사양을 기반으로 하며 사용자 지정 통화 목록 (CVS를 통해로드 됨)을 지원할 수 있습니다.
이 라이브러리에는 수정이 필요한 경우 신속하게 통과 할 수있는 적은 수의 파일이 있습니다. Joda-Money는 Apache 2.0 라이선스에 따라 게시됩니다.
달러와 센트 만 사용하는 경우에는 long (소수점 2 자리 오프셋)을 사용합니다. 더 자세한 정보가 필요하면 큰 십진수를 사용하는 것이 좋습니다.
어느 쪽이든, 올바른 형식을 사용하는 .toString ()을 가지도록 클래스를 확장하고 다른 메서드를 넣을 수있는 장소로 사용할 것입니다 (긴 소수의 경우 곱셈과 나눗셈이 잘못 될 것입니다). 조정되지 않음)
또한 자신의 클래스와 인터페이스를 정의하는 경우 원하는대로 구현을 대체 할 수 있습니다.
BigDecimal
또는 다른 고정 소수점 표현은 일반적으로 돈에 필요한 것입니다.
부동 소수점 ( Double
, Float
) 표현 및 계산이 정확하지 않아 잘못된 결과가 발생합니다.
시간과 돈을 다룰 때 너무 조심해야합니다.
당신이 돈으로 일할 때, 나는 모두가 절대로 플로트 나 더블을 사용하지 말아야한다는 것을 알아야합니다.
하지만 BigDecimal에 대해 잘 모르겠습니다.
대부분의 경우 int 또는 long으로 센트를 추적하면 괜찮습니다. 이런 식으로 소수점 자리를 처리하지 않습니다.
인쇄 할 때만 달러를 표시합니다. 항상 정수를 사용하여 내부 센트로 작업하십시오. Math.abs ()를 분할하거나 사용해야하는 경우 까다로울 수 있습니다.
그러나 당신은 반 센트, 심지어는 100 분의 1 센트까지 신경 쓸 수 있습니다. 이 작업을 수행하는 좋은 방법이 무엇인지 모르겠습니다. 천분의 일을 처리하고 long을 사용해야 할 수도 있습니다. 또는 BigDecimal을 사용해야 할 수도 있습니다.
나는 이것에 대해 더 많은 것을 읽고 싶지만 돈을 표현하기 위해 float 또는 double을 사용하는 것에 대해 이야기하기 시작하는 모든 사람들을 무시합니다. 그들은 단지 문제를 요구하고 있습니다.
제 조언이 완전하지 않다고 생각하니 더 많이 넣어주세요. 당신은 위험한 유형을 다루고 있습니다!
Money 클래스를 만드는 것이 좋습니다. 아래에 BigDecimal (또는 심지어 int) 사용. 그런 다음 Currency 클래스를 사용하여 반올림 규칙을 정의합니다.
불행히도 운영자가 Java를 오버로드하지 않으면 이러한 기본 유형을 만드는 것이 매우 불쾌합니다.
더 나은 라이브러리 인 timeandmoney가 있습니다. IMO는이 두 가지 개념을 표현하기 위해 JDK에서 제공하는 라이브러리보다 훨씬 우수합니다.
확실히 BigDecimal이 아닙니다. 반올림 및 표시에 대한 특별한 규칙이 너무 많아 걱정해야합니다.
Martin Fowler 는 통화 금액을 나타내는 전용 Money 클래스 구현을 권장하며 이는 통화 변환 규칙도 구현합니다.
여기에 BigDecimal에 대한 매우 흥미로운 기사가 있습니다. 왜 때때로 double 대신 사용되는지에 대한 설명이 있습니다. BigDecimal 튜토리얼 .
궁극적으로 통화 값을 표시 할 때 DecimalFormat 클래스를 사용할 수 있습니다. 현지화 지원을 제공하며 매우 확장 가능합니다.
위에서 언급 한 통화가있는 Money 클래스에 BigDecimal을 캡슐화합니다. 중요한 것은 특히 다른 통화로 작업하는 경우 극도의 단위 테스트를 수행한다는 것입니다. 또한 다음과 같이 테스트를 작성할 수 있도록 문자열 또는 동일한 작업을 수행하는 팩토리 메소드를 사용하는 편리한 생성자를 추가하는 것이 좋습니다.
assertEquals(Money.create("100.0 USD").add("10 GBP"),Money.create("116 USD"));
항상 제약과 세부 사항이 관련되어 있습니다. 다음 기사에 설명 된 미묘한 문제를 이해할 수있는 충분한 경험이없는 사람은 실제 재무 데이터를 다루기 전에 진지하게 재고해야합니다.
http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money
BigDecimal은 유일한 올바른 표현이나 퍼즐의 유일한 조각이 아닙니다. 특정 조건이 주어지면 정수로 저장된 센트로 뒷받침되는 Money 클래스를 사용하는 것으로 충분할 수 있으며 BigDecimal보다 훨씬 빠릅니다. 예, 이는 달러를 통화로 사용하고 금액을 제한한다는 것을 의미하지만 이러한 제약은 많은 사용 사례에서 완벽하게 허용되며 모든 통화에는 어쨌든 반올림 및 하위 단위에 대한 특수 사례가 있으므로 "보편적 인"솔루션이 없습니다.