2011-09-14 4 views
20

JP30がフィールドタイプとしてdoubleタイプをサポートしていますが、javax.validation.constraints(つまり@Min/)のBean検証制約がサポートされていない理由を教えてください。 これは丸め誤差によるものだと書類が知っていると知っていますが、フィールドタイプをdoubleにすると、私は明示的な精度についてあまり気にしません。Beanの検証を行う理由最小/最大制約はdouble型をサポートしていませんか?

私がこのジレンマに遭遇したシナリオは、次のとおりです。地球の表面上の点を表すエンティティを持っています。精度が数センチ以内であれば問題ありません。

注釈はダブルタイプをサポートしていないため、残念ながらこれは機能しません。しかし、代わりにBigDecimalを使用することは、実際には選択肢ではありません。なぜなら、私はいくつかの広範な計算を行っています。私はdoubleで動作するカスタム制約チェックを定義することでその周りに取り組みましたが、どういうわけか、全体のストーリーに欠けているものがあると思います。それで、私は何が欠けていますか?

+0

のいずれかに決定しなければならなかったので、JPAと豆の検証は、2つの完全に独立したAPIであることに注意してください。私はタイトル、いくつかの文言とタグをそれに応じて修正しました。素晴らしい質問の例btw。どのBean検証実装を使用していますか? Hibernate Validator? – BalusC

+0

はい、今はHibernate Validatorを使用しています。 –

+1

実際には、MinまたはMax(少なくともHibernate Validatorでは)でdoubleをアノテートすることができます。ダブルタイプがサポートされています。問題は、制約パラメーターとしてdoubleを指定できないことが原因と思われます。そこにスペックは実際に長い時間を強制する。 DecimalMinとDecimalMaxの使用を検討しましたか?最小値と最大値を文字列として指定できます。 – Hardy

答えて

6

丸めのためです。しかし、ダブルがあなたが望む数を表現するのに十分ではないかもしれないという問題のためではありません。注釈値(MinMax)はlong型であるため、小数点以下の桁数を表すことはできません。一方、longを表現できるすべての数値を正確に表現するためにdoubleを使うことはできません。

APIの設計者は、(長いまたはダブル)二つの方法

+0

その洞察をお寄せいただき、ありがとうございました。しかし、「long」と「double」の両方が64ビットを使用するため、比較を維持する同形があります。この同型異性は 'Double'や' Float'には組み込まれていないと思いますが、 'BigDecimal'を' long'に変換するより複雑な問題ではありません。したがって、これは 'ダブル 'のサポートが組み込まれていない理由を説明しますが、可能であることを示しています。そしてそれは、IMOでサポートするのに十分なはずです。 –

関連する問題