JVM:将 BigDecimal 作为 double 存储在数据库中是否安全?

JVM: Is it safe to store a BigDecimal as a double in a database?

我正在开发一个需要货币计算的应用程序,因此我们使用 BigDecimal 来处理此类数字。

我目前将 BigDecimals 作为字符串存储在 PostgreSQL 数据库中。这对我来说最有意义,因为我现在确信数字不会失去精度,而不是将它们作为双精度存储在数据库中。

问题是我真的不能为此做很多查询(即 'smaller than X' 不可能将数字存储为文本)

对于我必须对其执行复杂查询的数字,我只创建了一个名为 indexedY 的新列值(其中 Y 是原始列的名称)。即我有金额(字符串)和 indexedAmount(双)。我通过在 BigDecimal 实例上调用 toDouble() 将金额转换为 indexedAmount。

我现在只做查询,然后当找到 table 时,我只是将相同数字的字符串版本转换为 BigDecimal 并再次执行查询(这次是在获取的对象上), 只是为了确保我在 double 传输过程中没有任何舍入错误(从应用程序到数据库再返回到应用程序)

我想知道我是否可以避免创建索引 Y 列的这个额外步骤。

所以我的问题归结为:将 BigDecimal 的结果作为双精度存储在 (PostgreSQL) table 中而不丢失精度是否安全?

如果需要 BigDecimal,我会使用 NUMERIC 类型,其精度可满足您的需要。例如 NUMERIC(20, 20)

但是,如果您只需要 15 位精度,在数据库中使用双精度数可能没问题,在这种情况下,在 Java 中也应该没问题。