2013-04-25 31 views
44

NumberをBigDecimalに変換する最良の方法を探しています。Java NumberをBigDecimalに変換する:最良の方法

これで十分ですか?

Number number; 
BigDecimal big = new BigDecimal(number.toString()); 

toString()メソッドで精度を失うことはありますか?

+2

あなたのコードは 'NumberFormatException'をスローする可能性があります - もし' number'がInfinityまたはNaNの 'Double'ならhttp://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Double .html#toString(double) –

+0

チップをありがとう!私はこれをチェックするのを忘れた –

答えて

32

これは問題ありません。値を宣言するためにBigDecimalのコンストラクタを使用すると、文字列型でないと危険です。私はあなたのソリューションは、おそらくそのせいでの最も安全であると言うだろう...

BigDecimal valDouble = new BigDecimal(0.35); 
System.out.println(valDouble); 

これは0.35を印刷しないだろう、それがInfactはなります...以下

0.34999999999999997779553950749686919152736663818359375 

を考えてみましょう。

+0

うん、私はそれに気づいた。私の心配は 'Double'の' toString() 'メソッドです。私はこのメソッドで精度を失うことができるかどうか疑問に思っていました。 –

+0

いいえ、最初はBigDecimalの場合は自然に精度が高くなります。通貨を扱う場合は、常にBigDecimalをすべて作成する必要があります。それがDoubleからキャストされる前にBigDecimalとして宣言されていれば、それは私の意見では最高の解決策になり、Doubleを方程式から完全に取り除くことになります。 – david99world

16

toString()メソッドで精度を失うことはありますか?

種類Float.toString()Double.toString()は、出力がfloatまたはdouble値に一意に対応するために必要な小数点記号の後の桁数のみを出力します。

:直感的な期待が2つのBigDecimalのインスタンスが同じですが、出力はそうでないことを示している可能性があり

BigDecimal bd1 = new BigDecimal(0.35); 

Number n = 0.35; 
BigDecimal bd2 = new BigDecimal(n.toString()); 

System.out.println(bd1); 
System.out.println(bd2); 

:次のコードを検討し、david99worldの答えで0.35の例を使用するには

0.34999999999999997779553950749686919152736663818359375 
0.35 

0.35は正確に表現できないため、最初の行はdoubleの正確な値です。 2番目の行は0.35です。これは、別個の値を表すためにそれ以上の小数点が必要とされないためです。例えば。ステートメント0.34999999999999997779553950749686919152736663818359375 == 0.35trueと評価されます。

これはBigDecimalの作成時に実際に精度が失われることはなく、不確実性は既に「ソース」の値にあります。この問題は、むしろ、例えば、ソースとしてのfloat値またはdouble値は、必ずしもBigDecimalインスタンスの正確な同等物で表されるとは限りません。

関連する問題