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

Java 将数字(22,21)映射到BigDecimal时,休眠结果的精度损失,java,oracle,hibernate,double,bigdecimal,Java,Oracle,Hibernate,Double,Bigdecimal,我在Oracle 11g中将此列映射为数字(21,20),在Hibernate中映射为: @Column(name = "PESO", precision = 21, scale = 20, nullable = false) public BigDecimal getWeight() { return weight; } 对于列的值为0.493的特定记录,我得到一个值为0.49299999的BigDecimal。 似乎由于(可能)双精度或浮点转换,某个地方出现了精度损失,但我无法通过

我在Oracle 11g中将此列映射为数字(21,20),在Hibernate中映射为:

@Column(name = "PESO", precision = 21, scale = 20, nullable = false)
public BigDecimal getWeight() {
    return weight;
}
对于列的值为0.493的特定记录,我得到一个值为0.49299999的BigDecimal。 似乎由于(可能)双精度或浮点转换,某个地方出现了精度损失,但我无法通过这样一个简单的单元测试来跟踪它:

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中设置的,那么一切都正常。

对于我来说,获胜的解决方案是基于:


所以,我只提供了一个getter,它可以自动整理大小数。

这似乎不是hibernate错误。。。这完全是基于SquirreSQL的,它显示0.493表示值0.492999999。。。正如SqlDeveloper所报告的,“源”文件和数据库中的值都是这个值。感谢这个示例,可能是“%21.20”部分做了一些小动作,因为System.out.println(String.format(“%f”,新的BigDecimal(0.493));打印几乎精细->“0493000”。但这不是我的情况:-)
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);
}