Подтвердить что ты не робот

Почему bean проверки ограничений Min/Max не поддерживают двойной тип?

Может кто-нибудь объяснить мне, почему JPA поддерживает тип double как тип поля, но bean константы проверки в javax.validation.constraints (т.е. @Min/@Max) не поддерживают его? Я знаю, что документация говорит, что это связано с ошибками округления, но если я выбираю тип поля как 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;

}

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

4b9b3361

Ответ 1

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

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