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 中也应该没问题。
我正在开发一个需要货币计算的应用程序,因此我们使用 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 中也应该没问题。