문제

나는 BigDecimal이 Java에서 금전적 가치를 표현하는 데 권장되는 모범 사례라는 것을 이해합니다.당신은 무엇을 사용합니까?대신 사용하고 싶은 더 나은 라이브러리가 있나요?

도움이 되었습니까?

해결책

BigDecimal 모든 방법. 나는 일부 사람들이 자신의 것을 창조하는 것에 대해 들었습니다 Cash 또는 Money 통화로 현금 가치를 캡슐화하는 클래스이지만 피부 아래는 여전히 BigDecimal, 아마 BigDecimal.ROUND_HALF_EVEN 반올림.

편집하다: Don이 언급했듯이 그의 대답, 공개적인 프로젝트가 있습니다 시간 계급, 그리고 개발자가 휠을 재창조하지 못하게하려고 노력하는 것에 대해 박수를 보는 반면, 제작 환경에서 알파 이전 라이브러리에 대한 확신이 충분하지 않습니다. 게다가, 당신이 후드 아래를 파헤 치면, 당신은 그들은 사용합니다 BigDecimal ~도.

다른 팁

검색 엔진이 여기에 도착하는 사람들에게 Jodamoney에 대해 알 수 있습니다. http://www.joda.org/joda-money/.

나는 여기서 내 의견을 표현하지는 않지만, 누군가가 포기해야한다는 Bigdecimal에 대한 좋은 주장이 있습니다.

http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money/

내가 이전에 만난 편리한 라이브러리는 조다 돈 도서관. 구현 중 하나는 실제로 BigDecimal을 기반으로합니다. 그것은 기반입니다 ISO-4217 통화 사양 및 사용자 정의 통화 목록 (CVS를 통해로드)을 지원할 수 있습니다.

이 라이브러리에는 수정이 필요한 경우 빠르게 사용할 수있는 소수의 파일이 있습니다. Joda-Money는 Apache 2.0 라이센스에 따라 게시됩니다.

달러와 센트를 사용하는 경우 긴 (소수점 이하 2 자리로 오프셋)를 사용할 것입니다. 자세한 내용이 필요한 경우 Big Decimal이 갈 수 있습니다.

어느 쪽이든, 나는 아마도 올바른 형식을 사용하는 .tostring ()을 갖도록 클래스를 확장 할 것입니다. 't 조정)

또한 자신의 클래스와 인터페이스를 정의하면 구현을 마음대로 교체 할 수 있습니다.

BigDecimal 또는 또 다른 고정 점 표현은 일반적으로 돈에 필요한 것입니다.

부동 소수점 (Double, Float) 표현과 계산은 부족하여 잘못된 결과를 초래합니다.

시간과 돈을 다룰 때는 너무 조심해야합니다.

당신이 돈을 가지고 일할 때, 나는 모두가 부유물이나 더블을 사용하지 않는다는 것을 알기를 바랍니다.

그러나 나는 Bigdecimal에 대해 확신이 없습니다.

대부분의 경우 int 또는 긴 센트를 추적하면 괜찮습니다. 이렇게하면 소수점 이하를 다루지 않습니다.

인쇄 할 때만 달러 만 표시합니다. 정수를 사용하여 항상 센트와 함께 작업하십시오. 나누어야하거나 math.abs ()를 사용해야한다면 까다로울 수 있습니다.

그러나, 당신은 반 센트 또는 100 분의 1 센트에 관심을 가질 수 있습니다. 나는 이것을하는 좋은 방법을 모른다. 천 분의 1 센트를 다루고 오랫동안 사용하면됩니다. 아니면 Bigdecimal을 사용해야 할 수도 있습니다

나는 이것에 대해 훨씬 더 많은 독서를 할 것이지만, 돈을 대표하기 위해 플로트 또는 두 배를 사용하는 것에 대해 이야기하기 시작하는 모든 사람들을 무시합니다. 그들은 단지 문제를 요구하고 있습니다.

내 조언이 완전하지 않다고 생각하므로 더 많이 넣어주세요. 당신은 위험한 유형을 다루고 있습니다!

머니 클래스를 만드는 것은 갈 길입니다. 그 아래에 bigdecimal (또는 심지어 int)을 사용합니다. 그런 다음 통화 클래스를 사용하여 반올림 규칙을 정의합니다.

불행히도 운영자가 과부하가되지 않으면 Java는 이러한 기본 유형을 만드는 것이 매우 불쾌합니다.

더 나은 도서관이 있습니다. 시간 계급. IMO,이 두 가지 개념을 대표하기 위해 JDK가 제공 한 라이브러리보다 훨씬 우수합니다.

확실히 큰 것이 아닙니다. 반올림 및 프레젠테이션을위한 특별한 규칙이 너무 많아서 걱정해야합니다.

Martin Fowler는 전용의 구현을 권장합니다 통화 금액을 나타내는 클래스 및 통화 전환 규칙도 구현됩니다.

여기 BigDecimal에 대한 매우 흥미로운 기사가 ​​있습니다. 왜 때때로 double 대신 사용되는지에 대한 예시가 있습니다. BigDecimal 튜토리얼.

궁극적으로 통화 값을 표시 할 때 Decimalformat 클래스를 사용할 수 있습니다. 현지화 지원을 제공하며 매우 확장 가능합니다.

상기 언급 된 사람과 마찬가지로 화폐가있는 머니 클래스에서 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은 유일한 정확한 표현이거나 퍼즐의 유일한 부분은 아닙니다. 특정 조건이 주어지면 정수로 저장된 센트로 뒷받침되는 머니 클래스를 사용하면 충분할 수 있으며 Bigdecimal보다 훨씬 빠릅니다. 예, 이것은 통화 및 한계 금액으로 달러를 사용한다는 것을 의미하지만 많은 사용 사례에 대해 이러한 제약이 완벽하게 수용 가능하며 모든 통화에는 반올림 및 하위 부정을위한 특별한 사례가 있으므로 "보편적 인"솔루션이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top