2016-10-24 11 views
0

スケーリング、我々は与えられた数が範囲内にあるかどうか と、このために、我々はコードの下に使用しているかどうかを確認する必要があります -指数表記のためのBigDecimalにおける問題(Java)の我々のアプリケーションで

boolean isValidRangeNumber(Double no,int precision, int scale){ 
      BigDecimal bigDecimal = new BigDecimal(no.toString()); 
      int intPartLength = precision - scale; 
      int size = (bigDecimal.longValue() + "").toString().length(); 

      if(bigDecimal.precision() <= precision && bigDecimal.scale() <= scale && size <= intPartLength) 
       return true; 

      return false; 
     } 

しかし、私たちをisValidRangeNumber(0.0000009, 10,7)を呼び出しているのは、bigDecimal.scale()が8を与えているためです。これは有効な数字であるのに対し、max 7にすることができます。このBigDecimalの使い方に何が問題なのかをお聞かせください。

+0

は検証が行うことになっているかを説明することはできますか?バグのあるコードから正しい振る舞いを推測するのは難しいです。 – Henry

+0

は、入力された数値に小数点の前後の桁数が必要かどうかを確認します。 –

答えて

1

次調べると:ので、余分な末尾のゼロの

bigDecimal.toPlainString() // This will show 0.00000090 -> scale of 8, appends trailing 0 

を、条件が偽と評価され、次の。あなたは以下に変更することができ

bigDecimal.scale() <= scale // 8 <= 7 

boolean isValidRangeNumber(Double no, int precision, int scale) { 
    BigDecimal bigDecimal = new BigDecimal(no.toString()).stripTrailingZeros(); //Get rid of trailing zeros 
    bigDecimal.toPlainString(); 
    int intPartLength = precision - scale; 

    int size = (bigDecimal.longValue() + "").toString().length(); 

    if (bigDecimal.precision() <= precision && bigDecimal.scale() <= scale 
      && size <= intPartLength) 
     return true; 

    return false; 
} 
+0

はい、これを行うことで正しいスケールが得られますが、BigDecimalのこの動作についての簡単な説明と、bigDecimal.precision()が2を与える理由(有効桁数)は –

+0

ですあなたがBigDecimalのドキュメンテーションをさらに調べなければならないか疑問に思う。 –

+0

ありがとうSanchi .. :) –

関連する問題