java - 将数字 (22,21) 映射到 BigDecimal 时,Hibernate 在结果中丢失精度

标签 java oracle hibernate double bigdecimal

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

相关文章:

Java连接OracleDB : java. sql.SQLRecoverableException: IO error: The pipe has been cut

eclipse hibernate tomcat错误

java - 为什么 2020 年 3 月 30 日和 2020 年 3 月 1 日之间的差值错误地给出了 28 天而不是 29 天?

Java 音频可视化工具 - 如何捕获实时声音输出到扬声器?

sql - oracle嵌套表中的最大行数是多少

sql - Oracle子查询后出现类似错误

java - hibernate 中具有自定义实体的多对多 - 级联无法正常工作

java - 使用 SessionFactory 时 Hibernate 中的奇怪 NumberFormatException

java - 编译java程序时出错访问被拒绝错误

java - 将 XML 属性映射到 Jackson Xml Mapper 中指定的标记(字段)