将货币值存储为双打但使用BigDecimal计算值

时间:2011-08-26 03:59:08

标签: java hibernate double bigdecimal

目前我们的一些Hibernate实体使用双打存储货币金额,数据库将此值存储为数字(10,2)。这些货币双倍金额的计算总是使用BigDecimals计算,然后实体值设置为double。

示例:

Order order = new Order();
OrderLineItem line = new OrderLineItem(1.0, 450.00);
BigDecimal orderValue = BigDecimal.valueOf(line.getQty())
                        .multiply(BigDecimal.valueOf(line.getAmount()));
order.setOrderTotal(orderValue.setScale(2, ROUND_HALF_EVEN).doubleValue());

到目前为止,这种方法运行良好,但是我想知道这是否存在某种舍入误差的潜在风险。

思想?

1 个答案:

答案 0 :(得分:2)

只要您的信息渠道的每一部分都使用BigDecimal.valueOfBigDecimal(double)使用绝对,那么valueOf的隐式舍入可能会阻止最坏情况。但是你真的知道JPA和/或JDBC如何在numeric(10,2)double之间进行转换吗?你确定,这将来不会改变吗?

另一点:valueOfdoubleValue使用中间String表示。在某些情况下,这可能是性能和垃圾回收问题。

除此之外,还有足够的double问题示例 - 只需查看右侧的“相关”部分即可。或者看看这个blog甚至简单的东西都可以破坏。

所以情况有点像超速:有些人不这样做,有些人有时这样做,希望没有任何事情发生,有些......我想你明白了。