JVM: Безопасно ли хранить BigDecimal как двойное в базе данных? - PullRequest
0 голосов
/ 06 ноября 2018

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 06 ноября 2018

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

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

...