JVM: безопасно ли хранить BigDecimal как двойное в базе данных?

Я работаю над приложением, которое требует денежных расчетов, поэтому мы используем BigDecimal для обработки таких чисел.

В настоящее время я храню BigDecimals в виде строки в базе данных PostgreSQL. Это имело для меня наибольший смысл, потому что теперь я уверен, что числа не потеряют точности, в отличие от того, когда они хранятся в базе данных как двойники.

Дело в том, что я не могу сделать много запросов для этого (т.е. «меньше X» для числа, хранящегося в виде текста, невозможно)

Для чисел, с которыми мне приходится выполнять сложные запросы, я просто создаю новое значение столбца с именем indexedY (где Y — имя исходного столбца). То есть у меня есть сумма (строка) и indexedAmount (двойная). Я конвертирую сумму в indexedAmount, вызывая toDouble() в экземпляре BigDecimal.

Теперь я просто выполняю запрос, а затем, когда таблица найдена, я просто конвертирую строковую версию того же числа в BigDecimal и выполняю запрос еще раз (на этот раз для извлеченного объекта), просто чтобы убедиться, что я не t иметь какие-либо ошибки округления, пока двойник находился в пути (из приложения в БД и обратно в приложение)

Мне было интересно, могу ли я избежать этого дополнительного шага по созданию столбцов indexedY.

Итак, мой вопрос сводится к следующему: безопасно ли просто хранить результат BigDecimal как двойное значение в таблице (PostgreSQL) без потери точности?


person Peter Willemsen    schedule 05.11.2018    source источник


Ответы (1)


Если требуется BigDecimal, я бы использовал тип NUMERIC с такой точностью, какая вам нужна. Например, ЦИФРОВОЙ (20, 20)

Однако, если вам нужно только 15 цифр точности, использование двойного числа в базе данных может быть уместным, и в этом случае это должно быть хорошо и в Java.

person Peter Lawrey    schedule 06.11.2018
comment
… если вам нужно только 15 цифр точности, использование long было бы хорошо, особенно для денежных расчетов, которые вы все равно должны делать с арифметикой с фиксированной точкой. - person Holger; 06.11.2018
comment
Это также относится и к криптовалютам, некоторые из которых имеют до 18 знаков после запятой (например, Ethereum). Числового должно быть достаточно в этом отношении. Спасибо! - person Peter Willemsen; 06.11.2018