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



我在Oracle 11g中将这一列映射为NUMBER(21,20),它在Hibernate中映射为:

@Column(name = "PESO", precision = 21, scale = 20, nullable = false)
public BigDecimal getWeight() {
    return weight;
}

对于列值为0.493的特定记录,我得到一个值为0.49299999999的BigDecimal。似乎在某个地方由于(可能)Double或Float转换而失去了精度,但我无法用像这样的简单单元测试来跟踪它:

Double d = new Double("0.493");
System.out.println((d));

该代码的任何变体,使用Float, BigDecimal和各种构造函数都会得到相同的结果:"0.493"…关于如何映射列以避免此类问题,有什么提示吗?我使用Hibernate 3.5.6, JPA注释和Hibernate API(即Session而不是EntityManager)

这是double初始化BigDecimal的结果:

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

因此,当以这种方式初始化的BigDecimal保存在数据库中时,它会产生一个不准确的值,稍后会正确加载。

如果BigDecimal是由字符串初始化的,或者如果在Java中直接设置值,一切都可以正常工作。

对我来说,获胜的解决方案是基于我如何在Hibernate中映射一个BigDecimal,以便我得到与我输入的相同的比例?:

private final int SCALE = 2;
private final RoundingMode ROUNDING_MODE = RoundingMode.CEILING;
@Column(name = "value", precision = 8, scale = 2)
private BigDecimal value;
public BigDecimal getValue() {
    return value.setScale(SCALE, ROUNDING_MODE);
}

我刚才提供了一个getter来自动整理大小数

最新更新