Postgresql JVM:在数据库中将BigDecimal存储为double安全吗?

Postgresql JVM:在数据库中将BigDecimal存储为double安全吗?,postgresql,floating-point,jvm,bigdecimal,Postgresql,Floating Point,Jvm,Bigdecimal,我正在开发一个需要进行货币计算的应用程序,因此我们使用BigDecimal来处理这些数字 我目前将大小数作为字符串存储在PostgreSQL数据库中。这对我来说是最有意义的,因为我现在确信,与将数字作为双精度存储在数据库中时相比,数字不会失去精度 问题是,我真的无法对此进行大量查询(即,不可能对存储为文本的数字执行“小于X”的查询) 对于需要执行复杂查询的数字,我只需创建一个名为indexedY的新列值(其中Y是原始列的名称)。也就是说,我有amount(string)和indexedAmoun

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

我目前将大小数作为字符串存储在PostgreSQL数据库中。这对我来说是最有意义的,因为我现在确信,与将数字作为双精度存储在数据库中时相比,数字不会失去精度

问题是,我真的无法对此进行大量查询(即,不可能对存储为文本的数字执行“小于X”的查询)

对于需要执行复杂查询的数字,我只需创建一个名为indexedY的新列值(其中Y是原始列的名称)。也就是说,我有amount(string)和indexedAmount(double)。我通过对BigDecimal实例调用
toDouble()
将amount转换为indexedAmount

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

我想知道是否可以避免创建indexedY列这一额外步骤


因此,我的问题归结为:在(PostgreSQL)表中将BigDecimal的结果存储为double而不丢失精度是否安全?

如果需要BigDecimal,我将使用精度与您需要的精度相同的数字类型。例如数字(20,20)


但是,如果您只需要15位精度,在数据库中使用双精度可能很好,在Java中也应该可以。

…如果您只需要15位精度,使用
long
就可以了,特别是对于货币计算,不管怎样,你都应该使用定点运算。它也适用于加密货币,有些甚至可以达到18位小数(比如以太坊)。在这方面,数字应该足够了。谢谢