【发布时间】:2012-01-24 15:16:24
【问题描述】:
我有两个@Entitys,都有一个BigDecimal 字段,如下所示:
在一个模块中:
@Entity
@Table(name = "price_range")
public class PriceRange extends AbstractPersistable<Long> {
@Column(name = "price", precision = 19, scale = 4)
private BigDecimal price;
在另一个模块中:
@Entity
@Table(name = "invoice_position")
public class InvoicePosition extends AbstractPersistable<Long> {
@Column(name = "optimized_cost", precision = 19, scale = 4)
private BigDecimal optimizedCost;
两者都在我的数据库中创建具有正确精度和比例值的表:
Table invoice_position
======================
id,optimized_cost, ...
----------------------
optimized_cost decimal(19,4)
和
Table price_range
=================
id, price, ...
-----------------
price decimal(19,4)
测试前端将值正确保存到数据库中。
但是在单元测试中,两者之一返回一个带有舍入误差的值:
0.520000000000000017763568394002504646778106689453125
(调试器说:sacle = 51 和精度 = 0)
当另一个工作正常时:
0.5200
(调试器说:比例 = 4,精度 = 4)
这两个值都以相同的方式从数据库中检索(EntityManager 在 JpaRepository 中使用 CriteriaBuilder 构建一个 CriteriaQuery):
List<Invoice> invoices = invoiceProvider.findAll();
List<PriceRange> priceRanges = priceRangeProvider.findAll();
这可能是什么问题?或者更好:如果实体具有正确的规模和精度以及数据库,它会哪里出错?
我在这里很茫然,我在哪里可以找到错误?
【问题讨论】:
-
看起来可能是这样。那么在单元测试中初始化
BigDecimal的最佳实践是什么?使用String感觉……很奇怪…… -
你也可以用
long初始化它们并缩放,但看起来也不太好。 -
不过,使用字符串是正确的方法。由于舍入错误,其他任何事情都会失败。
标签: java hibernate scale precision bigdecimal