目前我们的一些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());
到目前为止,这种方法运行良好,但是我想知道这是否存在某种舍入误差的潜在风险。
思想?
答案 0 :(得分:2)
只要您的信息渠道的每一部分都使用BigDecimal.valueOf
而BigDecimal(double)
使用绝对,那么valueOf
的隐式舍入可能会阻止最坏情况。但是你真的知道JPA和/或JDBC如何在numeric(10,2)
和double
之间进行转换吗?你确定,这将来不会改变吗?
另一点:valueOf
和doubleValue
使用中间String
表示。在某些情况下,这可能是性能和垃圾回收问题。
除此之外,还有足够的double
问题示例 - 只需查看右侧的“相关”部分即可。或者看看这个blog甚至简单的东西都可以破坏。
所以情况有点像超速:有些人不这样做,有些人有时这样做,希望没有任何事情发生,有些......我想你明白了。