Hibernate 將浮點數型別設定為 BigDecimal,保證計算的精確性
阿新 • • 發佈:2019-02-17
浮點計算精度損失的文章比較多,我就不多說了,搜了一篇,見參考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