Reputation: 36640
I've got a double which I'm trying to save to a postgres numeric column.
The value I'm trying to save is 151.33160591125488, and I've verified that this is in fact the argument being received by Hibernates internals pre-insert.
However the value in the database post insert is 151.331605911255, ie it's been rounded to 12dp.
I know my column is of the right scale, as it's an unrestricted numeric column and the following...
update tbl set col=151.33160591125488
...has the desired effect.
So the culprit has to be either Hibernate or the postgres-JDBC driver.
Ideas?
EDIT:
org.hibernate.dialect.PostgreSQLDialect:
registerColumnType( Types.DOUBLE, "float8" );
and
select cast (151.33160591125488 as float8);
=151.331605911255
therefore the default behavior for double is incorrect, as it doesn't always save the double supplied to it.
Does anyone know how to get hibernate to use the column type "numeric" in postgres?
Upvotes: 3
Views: 10257
Reputation: 7937
Whenever precision matters use java.math.BigDecimal. This answer discusses this in great detail.
Upvotes: 3
Reputation: 100706
Java double
is not really appropriate for precise math operations. Use BigDecimal instead. Hibernate supports it as one of basic types:
<property name="amount" type="big_decimal" />
Upvotes: 2