【问题标题】:Hibernate - dealing with float values along with MS SQL Server [duplicate]Hibernate - 与 MS SQL Server 一起处理浮点值 [重复]
【发布时间】:2018-12-20 03:33:50
【问题描述】:

我正在尝试使用休眠将浮点值保存到 MS SQL Server 中。价值是 2.4 保存到数据库后就变成了这样。

2.40000009536743

这是我的实体类中该字段的列定义。

@Column(name = "fTotalChipWeight")
    private float totalChipWeight;

谁能告诉我为什么会这样

这是定义数据库列的方式

【问题讨论】:

  • 2.4 不能完全用二进制浮点表示,并且类型 float 仅提供 6-7 位十进制数字的精度。见Is floating point math broken?。我不愿将其作为一个骗子关闭,因为数据库列类型以及值的显示方式和位置可能存在一些复杂性,这些尚未披露。
  • 我已经修改了问题,提供了有关 db 列定义的更多详细信息
  • 一个 SQL float 不能代表 2.4。如果您恰好需要 2.4,则使用 decimal 可能会起作用。但是我们仍然没有足够的上下文来了解您的情况。
  • 您可以尝试将您的数据库字段更改为numeric(6,2),并为您的实体使用BigDecimal。这有帮助吗?
  • 还可以考虑使用double。尽管double 的值仍然不准确,但它的精度是其两倍,而且在double 精度下,人类通常看不到浮点错误。

标签: java sql-server hibernate floating-point


【解决方案1】:

当使用 IEEE 基本 32 位二进制浮点格式时,2.4 不能精确表示。最接近的可表示值为 2.400000095367431640625。当 2.4 转换为 32 位浮点时,就是结果。所以你看到的是实际价值。

【讨论】:

  • 你能告诉我如何完成它,以便我能够节省价值 2.4。哪种数据类型只允许按原样保存 2.4
  • @KItis:您没有向我们展示太多背景信息。你用Java标记了这个问题。如果把 2.4 放到一个float 中,那么值就是 2.400000095367431640625,原来的 2.4 就没有了。要让软件知道 2.4 的意图,必须有更多信息,而不仅仅是 float。您必须提供有关您正在做什么的更多信息。
猜你喜欢
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
相关资源
最近更新 更多