【问题标题】:Storing currency as BigDecimal in Hibernate/JPA - decimal(19,2)在 Hibernate/JPA 中将货币存储为 BigDecimal - decimal(19,2)
【发布时间】:2014-07-25 04:13:19
【问题描述】:

我将 Java 应用程序中保存货币值的字段从 double 更改为 BigDecimal,以防止出现奇怪的双舍入问题,例如“0.20000000000001”。

这现在创建了decimal(19,2) 的 SQL 日期类型,这意味着“.”右侧的 2 位数字。这真的是存储货币价值的更好方法,还是我什至会以这种方式失去精度?

【问题讨论】:

  • 如果您真的担心丢失精度,请改用整数数据类型。

标签: java hibernate jpa currency bigdecimal


【解决方案1】:

如果您不想丢失精度值,那么您应该使用 BigDecimal 而不是 BigInteger(在休眠/JPA 中的实体类中)

考虑以下演示:

    // some calculation
    double calculatedValue = 0.20039930000;

    BigDecimal amount = new BigDecimal("" + calculatedValue).setScale(2,
            BigDecimal.ROUND_HALF_UP);

【讨论】:

  • 对不起,我指的是 BigDecimal,而不是 BigInteger!更正了我的帖子
  • 感谢您的回答!你能解释一下它的一些部分吗?为什么new BigDecimal(calculatedValue); 不起作用?为什么需要用字符串连接双精度?
  • 当我猜 Josh 构建了他构建的 API 时,如果我们传递值(而不是字符串),那么它将使用原始数据类型进行计算。在其中一个 Google IO 事件中,他解释说这是 JDK 中的一个错误,他们已经在他们的库中修复了它(谷歌的库 - 在 IO 事件发生时他在谷歌)。 Sun/Oracle 不想改变核心 API 结构,因为它在多个地方使用,并且自从引入 BigDecimal 类以来就一直存在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多