如何在Java,SQL,ORM中使用货币数据类型

2022-09-02 09:00:05

在 Java 应用程序中使用货币数据类型的最佳实践是什么?货币应该是双变量吗?四舍五入,货币等等呢?是专用库吗?那么大多数流行数据库中的ORM和SQL呢?据我所知,并非所有SQL引擎都是Money数据类型。在那种情况下,还是应该使用REAL数据类型?NUMERIC(15,2)DECIMAL(15,2)


答案 1

在 Java 应用程序中使用货币数据类型的最佳实践是什么?

使用 BigDecimal。使用任何基元迟早会导致精度问题。

那么大多数流行数据库中的ORM和SQL呢?

Hibernate(可能还有其他人)可以很好地处理BigDecimal。它转换为适当的数据库类型,通常是DECIMAL。


答案 2

您应该 用于表示货币值。BigDecimal

来自 Bloch, J., Effective Java, 2nd ed, Item 48:

和 类型特别不适合货币计算,因为不可能将 0.1(或任何其他负 10 的次幂)表示为 a 或精确。floatdoublefloatdouble

例如,假设您有1.03美元,并且您花费了42美分。你还剩下多少钱?

System.out.println(1.03 - .42);

打印出 。0.6100000000000001

解决这个问题的正确方法是使用 ,或用于货币计算。BigDecimalintlong

对于 SQL,我使用 .NUMERIC(19,2)