我在 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 中设置,一切正常。
关于java - 将数字 (22,21) 映射到 BigDecimal 时,Hibernate 在结果中丢失精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5734036/