浮点计算精度损失的文章比较多,我就不多说了,搜了一篇,见参考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