2011-08-26 1 views
2

현재 Hibernate 엔티티 중 일부는 화폐 금액을 저장하기 위해 Doubles를 사용하고 있으며 데이터베이스는이 값을 숫자 (10,2)로 저장합니다. 이러한 통화 이중 금액의 계산은 항상 BigDecimal을 사용하여 계산 된 다음 엔티티 값이 double로 설정됩니다.돈 값을 Doubles로 저장하지만 BigDecimal을 사용하여 값을 계산

예 :

Order order = new Order(); 
OrderLineItem line = new OrderLineItem(1.0, 450.00); 
BigDecimal orderValue = BigDecimal.valueOf(line.getQty()) 
         .multiply(BigDecimal.valueOf(line.getAmount())); 
order.setOrderTotal(orderValue.setScale(2, ROUND_HALF_EVEN).doubleValue()); 

이이 오류를 반올림 어떤 종류의에 대한 잠재적 인 위험이있는 경우 그러나 내가 궁금하네요 지금까지 잘 근무하고있다.

생각하십니까? 정보 파이프 라인의 모든 조각 BigDecimal.valueOfBigDecimal(double)을 사용하기 때문에

+1

BigDecimal로가는 것이 훨씬 안전합니다 ... 당신이 말한대로, 그것은 이미 DB에서 BigDecimal이고, 응용 프로그램 코드에서 BigDecimal입니다. 그렇다면 엔티티 정의를 업데이트하지 않는 이유는 무엇입니까? – Thilo

+0

그러나 리팩터링하면 리플 효과가 있습니다. 투영 쿼리를 사용하므로 값이 Double 대 BigDecimal이기를 기대하므로 Object에서 캐스팅 할 때 컴파일 오류로 표시되지 않습니다. 두 배로. 또한 현재 전체 애플리케이션에 대한 테스트 사례가 없기 때문에 테스트가 상당히 필요합니다. – David

+1

일반적으로 금융 세계에서는 모든 값을 페니/센트로 '장기'로 저장합니다. money에 대해서는 부동 소수점 값을 사용하지 말아야하며 BigDecimal은 필요하지 않습니다. 그냥'긴'을 사용하십시오. –

답변

2

만큼 절대적으로가 갑자기 다음 valueOf의 암시 적 라운딩이 최악을 방지 할 수 을 사용한다. 하지만 JPA 및/또는 JDBC가 numeric(10,2)double 사이에서 어떻게 변환되는지 실제로 알고 있습니까? 그리고 이것은 미래에 변하지 않을 것이라고 확신합니까?

다른 점 : valueOfdoubleValue은 중간 표현이 String 인 것으로 작동합니다. 일부 상황에서는 성능 및 가비지 수집 문제 일 수 있습니다.

이외에도 double의 문제에 대한 예제가 있습니다. 오른쪽의 관련 항목을 참조하십시오. 또는 심지어 blog을 보더라도 간단한 물건으로도 혼란을 겪을 수 있습니다.

그래서 속도 위반과 같은 상황입니다. 어떤 사람들은 그것을하지 않으며, 어떤 사람들은 때때로 그것을하지 않으며 아무 일도 일어나지 않기를 희망합니다. 나는 당신이 그것을 얻은다고 생각합니다.