当前位置: 首页 > 面试题库 >

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

子车青青
2023-03-14
问题内容

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

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

对于该列的值为0.493的特定记录,我得到一个BigDecimal,其值为0.49299999999。似乎某处由于Double或Float转换而导致精度下降,但我无法通过以下简单的单元测试来跟踪精度:

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

使用Float,BigDecimal和各种构造函数的该代码的任何变体都会产生相同的结果:“ 0.493”
…关于如何映射该列以避免此类问题的任何提示?我正在使用带有JPA批注和Hibernate
API(即Session而不是EntityManager)的Hibernate 3.5.6。


问题答案:

这是BigDecimal从初始化的结果double

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

因此,以BigDecimal这种方式进行初始化时,将其保存在数据库中时,会产生不正确的值,稍后将其正确加载。

如果BigDecimal由字符串初始化,或者如果直接在Java中设置了值,则一切正常。



 类似资料:
  • 问题内容: 有人可以向我展示如何在Hibernate中编写以下SQL并正确获取结果的示例吗? 如果可能的话,我想做的就是将结果放入自己的基类中: 我相信在JPA(使用)中是可能的,但是我还没有弄清楚如何在Hibernate(使用和)中做到这一点。 我试图更好地学习Hibernate,即使这个“简单”查询也令人困惑,无法知道Hibernate以哪种形式返回结果,以及如何将结果映射到我自己的(基)类中

  • 我开始使用JOOQ和dvd租赁商店数据库aka sakila。基本上,我想找一个演员和他的角色(我创建的表)。到目前为止,我想到了这个: 我希望能够将演员及其角色提取到一个对象中:DTO。我找到了这篇文章https://arnaudroger.github.io/blog/2017/03/02/jooq-one-to-many-without-dto.html但我发现使用sfm的解决方案过于冗长,

  • 问题内容: 任何人都可以告诉我或提供对Oracle数字精度和Java类型之间映射的引用,即在什么时候number(x)映射到short,int,long BigInteger等。 问题答案: Java的整数类型与Oracle的类型不是完美匹配。本质上,有两种方法可以在世界之间进行映射,但都不完美: 现状: 严格小于-> 。 这样可以确保始终可以将SQL值读取为其Java类型。某些Java值可能无法

  • 我在寻找更“改进的方法”来实现这一点,我有一种方法,从一个id中获取所有记录,然后“映射”到一个类中,我有大约200个“标记”要映射,这将是一个非常长的if链。。。例子:

  • 我有一个用户类,有16个属性,比如名字,姓氏,出生日期,用户名,密码等...这些都存储在MySQL数据库中,当我想要检索用户时,我使用ResultSet。我想将每一列映射回用户属性,但我这样做的效率似乎非常低。例如,我正在做: 也就是说,我检索所有的列,然后通过将所有的列值插入用户构造函数来创建用户对象。 有人知道更快、更整洁的方法吗?

  • 问题内容: 我的代码是 编译时出现以下错误 但是,当我使用它代替它成功编译时,那么我的问题是,当所有3个变量(即a,b和c)都是字节数据类型时,为什么需要强制转换? 问题答案: ,此处的运算符将返回,这就是您需要使用强制转换的原因。