2011-04-20 39 views
5

Tôi có cột này trong Oracle 11g tôi ánh xạ như NUMBER (21,20), được ánh xạ trong Hibernate như:Hibernate mất độ chính xác trong kết quả khi ánh xạ một số (22,21) để BigDecimal

@Column(name = "PESO", precision = 21, scale = 20, nullable = false) 
public BigDecimal getWeight() { 
    return weight; 
} 

Đối với một bản ghi cụ thể mà giá trị của cột là 0,493 tôi nhận được một BigDecimal có giá trị là 0,49299999999. Dường như đâu đó có một mất độ chính xác do (có thể) cho một đôi hoặc Float chuyển đổi, nhưng tôi không thể theo dõi nó xuống với một thử nghiệm đơn vị đơn giản như thế này:

Double d = new Double("0.493"); 
System.out.println((d)); 

Bất kỳ biến thể của mã mà , sử dụng Float, BigDecimal và các hàm tạo khác nhau cho kết quả tương tự: "0,493" ... Bất kỳ gợi ý nào về cách ánh xạ cột để tránh các vấn đề như vậy? Tôi đang sử dụng Hibernate 3.5.6, với chú thích JPA và Hibernate API (có nghĩa là phiên và không EntityManager)

+0

có vẻ như đây không phải là lỗi ngủ đông ... Điều này hoàn toàn trên SquirrelSql, hiển thị 0,493 với giá trị 0,49299999999 ... Giá trị luôn là, cả trong tệp "nguồn", cả trong cơ sở dữ liệu , như SqlDeveloper báo cáo. –

Trả lời

3

Đó là một kết quả của việc khởi tạo BigDecimal từ double:

System.out.println(String.format("%21.20f", new BigDecimal(0.493)); 
// Prints 0,49299999999999999378 

Vì vậy, khi BigDecimal khởi tạo này cách được lưu trong cơ sở dữ liệu, nó tạo ra một giá trị không chính xác, được nạp đúng sau.

Nếu BigDecimal được khởi tạo bằng chuỗi hoặc nếu giá trị được đặt trực tiếp trong Java, mọi thứ hoạt động tốt.

+0

cảm ơn ví dụ, có lẽ phần "% 21.20" thực hiện một số mẹo vì System.out.println (String.format ("% f", BigDecimal mới (0.493))); in gần như tốt -> "0,493000". Đó không phải là trường hợp của tôi mặc dù :-) –

Các vấn đề liên quan