我在Oracle 11g中将此列映射为NUMBER(21,20),在Hibernate中映射为:
@Column(name = "PESO", precision = 21, scale = 20, nullable = false) public BigDecimal getWeight() { return weight; }
对于该列的值为0.493的特定记录,我得到一个BigDecimal,其值为0.49299999999。似乎某处由于Double或Float转换而导致精度下降,但我无法通过以下简单的单元测试来跟踪精度:
Double d = new Double("0.493"); System.out.println((d));
使用Float,BigDecimal和各种构造函数的该代码的任何变体都会产生相同的结果:“ 0.493” …关于如何映射该列以避免此类问题的任何提示?我正在使用带有JPA批注和Hibernate API(即Session而不是EntityManager)的Hibernate 3.5.6。
这是BigDecimal从初始化的结果double:
BigDecimal
double
System.out.println(String.format("%21.20f", new BigDecimal(0.493)); // Prints 0,49299999999999999378
因此,以BigDecimal这种方式进行初始化时,将其保存在数据库中时,会产生不正确的值,稍后将其正确加载。
如果BigDecimal由字符串初始化,或者如果直接在Java中设置了值,则一切正常。