Хранение денежных значений в виде Doubles, но с использованием BigDecimal для вычисления значений - PullRequest
2 голосов
/ 26 августа 2011

В настоящее время некоторые из наших объектов Hibernate используют Double для хранения денежных сумм, база данных хранит это значение в виде числа (10,2). Расчет этих денежных двойных сумм всегда рассчитывается с использованием BigDecimals, а затем значение сущности устанавливается как двойное.

Пример:

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());

До сих пор это работало нормально, однако мне интересно, есть ли в этом потенциальный риск какой-либо ошибки округления.

Мысли

1 Ответ

2 голосов
/ 09 октября 2011

Пока каждая часть вашего информационного конвейера использует BigDecimal.valueOf, а BigDecimal(double) используется абсолютно нигде, неявное округление valueOf может предотвратить худшее. Но вы действительно знаете, как JPA и / или JDBC переводят между numeric(10,2) и double? И уверены ли вы, что это не изменится в будущем?

Еще один момент: valueOf и doubleValue работают с промежуточными String представлениями. В некоторых ситуациях это может быть связано с производительностью и сборкой мусора.

Кроме того, есть достаточно примеров проблем с double - просто посмотрите в раздел «Связанные» с правой стороны. Или посмотрите этот блог , где даже простые вещи могут разрушить.

Так что ситуация немного похожа на ускорение: некоторые не делают этого, некоторые делают это иногда и надеются, что ничего не происходит, а некоторые ... Я думаю, вы понимаете.

...