3

我正在尝试将浮点数存储在 MySQL 数据库中,但 Hibernate 的值与存储在列中的值不同,

在我的应用程序中,我计算:

float subtotal = 160.5f;
float ammount = (float) (subtotal * 0.1f); // this way I get the 10%
receipt.setAmmount(ammount);
receipt.save();

如果我记录该数量,我会得到如下信息:

19/04/2013 10:17:20 [INFO] ServiceImpl: Added ammount x $16.05

ammount在 mysql 数据库中的列是FLOAT UNSIGNED,当我进行选择时,我获得 16.05 作为值,但后来,当我使用 Hibernate 获取该对象时,ammount 字段为 16.049999237060547。

我的 hbm 专栏如下所示:

<property name="ammount" type="float"></property>

我在这里这里阅读建议BigDecimal在 Java 中使用而不是Float为了Double钱,但我无法获得我应该在我的数据库中使用什么数据类型或如何配置 Hibernate 以使用该数据类型,谢谢!

4

2 回答 2

3

DECIMAL 和 NUMERIC 类型的推荐 Java 映射是 java.math.BigDecimal。java.math.BigDecimal 类型提供数学运算以允许 BigDecimal 类型与其他 BigDecimal 类型、整数类型和浮点类型相加、减、乘和除。

检索 DECIMAL 和 NUMERIC 值的推荐方法是 ResultSet.getBigDecimal。JDBC 还允许以简单的字符串或字符数组的形式访问这些 SQL 类型。因此,Java 程序员可以使用 getString 来接收 DECIMAL 或 NUMERIC 结果。但是,这使得 DECIMAL 或 NUMERIC 用于货币值的常见情况

看这里

于 2013-04-19T13:41:37.387 回答
2

我想我会尝试在数据库中将您的列定义为 NUMBER(6,2) 并在您的 java 层中使用 BigDecimal 对象。您不应该对货币使用浮点数。

于 2013-04-19T13:42:18.283 回答