2016-04-04 7 views
3

変数 'longValueToConvert'に含まれるLong(Object one)をBigDecimalに変換する必要があります。BigDecimalに変換する前の文字列の長さ

私はこのような何かをやっているだろう:

new BigDecimal(longValueToConvert) 

しかし、私は、このキャストは、変換中にエラーを誘発することができることを読んで、それを使用する前に、文字列へのロングキャストするために好まれていますBigDecimalコンストラクタ

new BigDecimal(longValueToConvert.toString()) 

最初の1つまたは2番目のものを使用するとよいでしょうか?私はJava 8を使用しています。

+0

コードにキャストは含まれていません。また、変換エラーは発生しません。 –

答えて

11

あなたは間違っていました。 BigDecimal(long)コンストラクタからの変換エラーはありません。 A longは正確に表現することができ、問題なく、BigDecimalを作成できます。

BigDecimal(double)コンストラクタを使用する場合にのみ、注意が必要です。これは、一部のdoubleの値を正確に表すことができないためです。ドキュメントから:

このコンストラクタの結果は、やや予測できません。 Javaでnew BigDecimal(0.1)を書くと、 [...]と全く同じBigDecimalが作成されますが、実際には0.1000000000000000055511151231257827021181583404541015625に等しくなります。これは、0.1double [...]と正確に表すことができないためです。

一方、Stringコンストラクタは完全に予測可能です。new BigDecimal("0.1")を書き込むと、正確に0.1に等しいBigDecimalが作成されます。したがって、Stringコンストラクタをこのコンストラクタより優先して使用することが一般に推奨されます。

+2

また、[ファクトリメソッド](https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#valueOf-long-int-)は、新しいオブジェクトを作成します。 – bcsb1001

1

あなたはこれを試すことができます。これは正常に動作します

new BigDecimal(longValueToConvert.longValue()) 

。浮動小数点数を精度の問題として表現するときは、あなたの懸念があるはずです。例えばBigDecimal (double)またはBigDecimal(float)コンストラクタを使用しているとき。これらのシナリオはありますか?また、ここの名前はあなたにすべてを伝えます。 Longは浮動小数点数には問題ありませんが、他の方向からの入力には注意が必要です。

+1

これはうまくいくが、結果は全く新しい 'BigDecimal(longValueToConvert)'と同じになる。 –

+0

* "浮動小数点数に変換するには問題ありません" * - 実際は 'long'を' 'float'や' double' *は精度を失う可能性があります。 –

+0

長文を長文に変換するのはなぜですか?私には分かりません。 –

関連する問題