使用Hibernate浮点映射精度

时间:2013-04-19 13:34:37

标签: java hibernate

我正在尝试在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中的我的列ammountFLOAT UNSIGNED,当我执行select时,我获得了16.05作为值但稍后,当我使用Hibernate获取该对象时,ammount字段为16.049999237060547。

我的hbm专栏如下:

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

我正在阅读herehere,建议您在Java中使用BigDecimal代替FloatDouble,但我不能得到我应该在我的数据库中使用什么数据类型或如何配置Hibernate使用该数据类型,谢谢!

2 个答案:

答案 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用于货币值的常见情况

SEE HERE

答案 1 :(得分:2)

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