2012-06-05 6 views
10

私は大きな小数の精度と位取りを検証しようとしています。BigDecimalで精度と位取りを検証するにはどうすればよいですか?

大10進が10の精度か2の尺度を超えないことを検証しようとしています。maxlengthを試してみましたが、その値はDBの長さの制約に違反しませんでしたが、取得できませんでしたそれも働いている。誰かがこの問題を解決する方向で私を親切に指摘できますか?

+0

多分(ただし、オラクルベース)NUMBER(10,2)のような? –

+0

sybaseを使用しているため、Oracleについてはあまりよく分かりません。私は、テストするためにif文を使ってjavaでフィールドバリデーターを構築しようとしています。送信される値が10,2を超えないようにしてください。 –

答えて

23

BigDecimalクラスは、このために興味深いかもしれない三つの方法があります

  • precision()、スケーリングされていない値の桁数を返す(たとえば、数123.45のために、返される精度は5であります)
  • scale()は、正の場合に小数点区切り文字の後ろの桁数を返します(scale()は負になります)。この場合、数値のスケールされていない値には、スケールの否定の累乗に10が掛けられます。 -3のスケールは、スケールされていない値に1000を掛けたことを意味します)、
  • stripTrailingZeros()は、BigDecimalを返します。すべての末尾のゼロは、表現から削除されます。

例えば、与えられたBigDecimal Bの精度と位取りを計算するために、我々はそのような何かを書くことができます:

BigDecimal noZero = b.stripTrailingZeros(); 
int scale = noZero.scale(); 
int precision = noZero.precision();  
if (scale < 0) { // Adjust for negative scale 
    precision -= scale; 
    scale = 0;   
} 
+0

これはまさに私が探していたものです、私は完全にAPIの規模と精度を欠場しました。私には恥ずべき。 –

+0

@Teetoo、@George - もし 'if'ブロックで' scale = 0; 'と' precision - = scale; 'を入れ替えなければならないと思いませんか? – Premraj

+0

@Teetoo私は変更を行った、それを確認:) – Premraj

関連する問題