一尘不染

将数字(22,21)映射到BigDecimal时,结果的Hibernate精度损失

hibernate

我在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。


阅读 334

收藏
2020-06-20

共1个答案

一尘不染

这是BigDecimal从初始化的结果double

System.out.println(String.format("%21.20f", new BigDecimal(0.493)); 
// Prints 0,49299999999999999378

因此,以BigDecimal这种方式进行初始化时,将其保存在数据库中时,会产生不正确的值,稍后将其正确加载。

如果BigDecimal由字符串初始化,或者如果直接在Java中设置了值,则一切正常。

2020-06-20