Гибернация потери точности результатов при отображении числа (22,21) в BigDecimal - PullRequest
5 голосов
/ 20 апреля 2011

У меня этот столбец в Oracle 11g отображается как NUMBER (21,20), который отображается в Hibernate как:

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

Для конкретной записи, для которой значение столбца равно 0,493, я получаю BigDecimal, значение которого равно 0,49299999999. Кажется, что где-то происходит потеря точности из-за (возможно) преобразования Double или Float, но я не мог отследить его с помощью простого модульного теста, подобного этому:

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

Любой вариант этого кода с использованием Float, BigDecimal и различных конструкторов дает один и тот же результат: «0,493» ... Любой намек на то, как я должен сопоставить столбец, чтобы избежать таких проблем? Я использую Hibernate 3.5.6, с аннотациями JPA и Hibernate API (то есть Session, а не EntityManager)

1 Ответ

3 голосов
/ 20 апреля 2011

Это результат инициализации BigDecimal из double:

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

Итак, когда инициализированный таким образом BigDecimal сохранен в базе данных, он выдает неточное значение, которое правильно загруженопозже.

Если BigDecimal инициализируется строкой или если значение установлено непосредственно в Java, все работает нормально.

...