2011-07-12 7 views
1

私はfollwingとしてjavaの大きな小数を使用しています:123456.678000、456789.567890:私は大きな小数を作成するために使用していますJavaのビッグ10進問題

class test bigDecimal{ 

private BigDecimal decimalResult; 


    public boolean iterate(String value) { 
     if (value == null) { 
      return true; 
     } 

     System.out.println("value is: " + value); 

     BigDecimal temp = new BigDecimal(value); 

     System.out.println("temp val is: " + temp); 
     if (decimalResult == null) { 
      decimalResult = temp; 
     } else { 
      decimalResult = decimalResult.add(temp); 
     } 

     return true; 
    } 

}

すべての文字列は、例えばのために6の規模を持っています

しかし、文字列の大きなリストを入力として合計をチェックすると、小数点以下8桁の出力が得られます。たとえば。 2939166.38847228のようなものです。

BigDecimalがこのスケールを変更するのはなぜですか?私のすべての入力は6のスケールを持っています。

すべての入力を感謝します。 -thanks

+1

これを示す[SSCCE](http://sscce.org)を投稿できますか? –

+0

lol @ '任意の入力は高く評価されています。 ' –

+0

入力は、大きな小数点で合計され、文字列として印刷されるような、約1百万のそのような値です。 – user656189

答えて

6

BigDecimalのJavadocを読んでください: http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html 内部では全てのBigDecimalは、いくつかの内部フォーマットに変換し得ます。

特定のフォーマットを取得したい場合は、それを適切に呼び出す必要があります。 あなたはああ、と代わりにBigDecimal.valueOfを使用し、new BigDecimalを使用しない方法によって例えばscaleByPowerOfTen(int n)のn = 6

を使用することができます。

EDIT:

NumberFormat numberFormat = NumberFormat.getInstance(); // use a locale here String formated = df.format(myUnformatedBigDecimal);

+0

newを使用しないことについては、文字列から大きな10進数を作成するために使用している文字列があります。 valueOfは入力としてlong/doubleのみを受け入れます。私の場合、入力は21文字になりますが、それはlong/doubleが保持するものよりも大きいものです。 – user656189

0

それは内部表現の問題ではありません。これにより、BigDecimal.toString()が機能します。 layoutChars(true) - numberの書式を設定するプライベートメソッドを呼び出します。ハードコーディングされたスケールは6です。しかし、それは問題ではないと思います。あなたは本当にすべての数字をパイントする必要はありません。 BigDecimalは、高精度の数値を計算する機能を提供します。それはそれがするものです。

+0

申し訳ありませんが、あなたは絶対に正しいです。私はBigIntegerの内部表現を考えました。 次のようなものを使用してください。 NumberFormat numberFormat = NumberFormat.getInstance(); //ここでロケールを使用します 文字列formated = df.format(myUnformatedBigDecimal); – FlorianOver

関連する問題