1. 程式人生 > >Hibernate 將浮點數型別設定為 BigDecimal,保證計算的精確性

Hibernate 將浮點數型別設定為 BigDecimal,保證計算的精確性

浮點計算精度損失的文章比較多,我就不多說了,搜了一篇,見參考1。

設定方式如下:

大數字有精度precision和小數位scale兩個引數可設定,精度的位數是包含小數位數的,即整數位=精度-小數位。對於超過小數位的小數,用四捨五入法進行擷取。

運算過程中保留6位小數,儲存到資料庫時保留4位小數。

Hibernate的配置中精度用預設值(19),精度設為4,格式如下:

              <propertyname="price" type="java.math.BigDecimal">

                     <column name="price"scale="4" />

              </property>

由於BigDecimal型別的資料不能直接用==判斷相等,因此在現有程式碼中用這比較的部分,需要替換為用compare函式的比較,如a.compareTo(b) == 0。運算均需要呼叫對應的函式,如:

加:a.add(b)

減:a.subtract(b)

乘:a.multiply(b)

除:a.divide(b, 2, BigDecimal.ROUND_HALF_EVEN)

模:a.remainder(b)

比較:a.compareTo(b)==0

參考資料:

1.java 浮點數表示詳解.http://hujiantao224.iteye.com/blog/727155