현재 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.valueOf
및 BigDecimal(double)
을 사용하기 때문에
BigDecimal로가는 것이 훨씬 안전합니다 ... 당신이 말한대로, 그것은 이미 DB에서 BigDecimal이고, 응용 프로그램 코드에서 BigDecimal입니다. 그렇다면 엔티티 정의를 업데이트하지 않는 이유는 무엇입니까? – Thilo
그러나 리팩터링하면 리플 효과가 있습니다. 투영 쿼리를 사용하므로 값이 Double 대 BigDecimal이기를 기대하므로 Object에서 캐스팅 할 때 컴파일 오류로 표시되지 않습니다. 두 배로. 또한 현재 전체 애플리케이션에 대한 테스트 사례가 없기 때문에 테스트가 상당히 필요합니다. – David
일반적으로 금융 세계에서는 모든 값을 페니/센트로 '장기'로 저장합니다. money에 대해서는 부동 소수점 값을 사용하지 말아야하며 BigDecimal은 필요하지 않습니다. 그냥'긴'을 사용하십시오. –