为什么Bean验证最小/最大约束不支持Double类型?

请解释一下,为什么JPA支持double类型作为字段类型,而javax.validation.constraints中的Bean验证约束(即@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;

}
不幸的是,这不起作用,因为注释不支持Double类型。但是使用BigDecimal并不是一种真正的选择,因为我有一些大量的计算,需要进行多个点,这仍然需要相当快。我通过定义适用于double的自定义约束检查解决了这个问题,但不知何故,我认为在整个故事中我遗漏了一些东西。那么,我错过了什么?


解决方案

因为四舍五入。但这并不是因为双精度数可能不足以表示您想要的数字的问题。更重要的是,MinMax的注释值是Long类型的,所以它不能表示任何带小数位的数字。另一方面,您不能使用双精度型来精确地表示长整型可以表示的所有数字。

所以API设计人员必须在两种方式中选择一种(长的或双倍的)

相关文章