Почему ограничения Min / Max проверки бинов не поддерживают тип double? - PullRequest
21 голосов
/ 15 сентября 2011

Может кто-нибудь объяснить мне, почему JPA поддерживает тип double в качестве типа поля, но проверка бина содержит в javax.validation.constraints (то есть @ Мин / @ Макс ) не поддерживаете это? Я знаю, что в документации сказано, что это связано с ошибками округления, но если я выберу тип поля равным double, я уже признаю, что меня не волнует явная точность.

Сценарий, с которым я столкнулся, заключается в следующем: у меня есть сущность, представляющая точку на поверхности земли. Если точность в пределах нескольких сантиметров, это нормально. Это выглядит примерно так:

@Entity
public class Point {

    /**
     * The longitude in radians.
     */
    @Min(-Math.Pi)
    @Max(Math.Pi)
    double longitude;
    /**
     * The latitude in radians.
     */
    @Min(-Math.Pi / 2)
    @Max(Math.Pi / 2)
    double latitude;

}

К сожалению, это не работает, потому что аннотации не поддерживают тип double. Но использование BigDecimal вместо этого не является возможным вариантом, потому что у меня есть некоторые обширные вычисления с несколькими точками, которые все еще должны быть достаточно быстрыми. Я решил эту проблему, определив пользовательскую проверку ограничений, которая работает с double s, но почему-то мне кажется, что во всей этой истории я что-то упускаю. Итак, что мне не хватает?

1 Ответ

6 голосов
/ 15 сентября 2011

Это из-за округления.Но не из-за проблемы, что двойное число может быть недостаточно правильным, чтобы выразить желаемое число.Более того, значение аннотации (Min и Max) имеет тип long, поэтому оно не может выражать любое число с десятичными знаками.С другой стороны, вы не можете использовать double для точного выражения всех чисел, которые могут выражать long.

Поэтому разработчикам API пришлось выбрать один из двух способов (long или double)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...