我在 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)
这是初始化的结果BigDecimal
from double
:
System.out.println(String.format("%21.20f", new BigDecimal(0.493));
// Prints 0,49299999999999999378
所以,当BigDecimal
以这种方式初始化并保存在数据库中,它会产生一个不准确的值,稍后会正确加载。
If BigDecimal
由字符串初始化,或者如果直接在 Java 中设置值,则一切正常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)