我正在尝试在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
mysql db中的我的列ammount
是FLOAT UNSIGNED
,当我执行select时,我获得了16.05作为值但稍后,当我使用Hibernate获取该对象时,ammount字段为16.049999237060547。
我的hbm专栏如下:
<property name="ammount" type="float"></property>
我正在阅读here和here,建议您在Java中使用BigDecimal
代替Float
或Double
,但我不能得到我应该在我的数据库中使用什么数据类型或如何配置Hibernate使用该数据类型,谢谢!
答案 0 :(得分:3)
DECIMAL和NUMERIC类型的推荐Java映射是 java.math.BigDecimal中。 java.math.BigDecimal类型提供数学 允许添加,减去BigDecimal类型的操作, 用其他BigDecimal类型乘以整数 类型和浮点类型。
建议用于检索DECIMAL和NUMERIC值的方法是 ResultSet.getBigDecimal。 JDBC还允许访问这些SQL类型 简单的字符串或char数组。因此,Java程序员可以使用 getString接收DECIMAL或NUMERIC结果。但是,这样做 DECIMAL或NUMERIC用于货币值的常见情况
答案 1 :(得分:2)
我想我会尝试在数据库中将列定义为NUMBER(6,2)并在java层中使用BigDecimal对象。你不应该使用浮动货币。