2017-11-13 78 views
1

BigDecimal値の精度を次のように指定しようとしています:new BigDecimal(12.99).setScale(2, BigDecimal.ROUND_HALF_EVEN。しかし、コンパイラはsetScale(int, int)が推奨されなくなりました。BigDecimal.setScale(int、int)およびRoundingMode列挙体で推奨されないコンストラクタ

RoundingMode列挙型を使用しようとすると、列挙型が初期化されていない可能性があります。列挙型を正しく使用してsetScale(int, RoundingMode)のBigDecimalsをインスタンス化するにはどうすればよいですか?

ありがとうございます!

+0

問題を再現するためにエディタにコピーできるコードで実行可能な例を表示します。 –

+0

値12.99のBigDecimalを作成する場合は、単に 'BigDecimal.valueOf(1299、2)'を使用してください。 @KlitosKyriacou。 –

+0

私は、 "初期化されていない"問題を引き起こしているコードを意味しました。それをキャッチするためにありがとう。 –

答えて

3

ドキュメントによると、setScale(int, int)は、列挙型が最初に導入されたとき、Java 1.5以降推奨されていません。

この新しい方法よりも新しいsetScale(int, RoundingMode)メソッドを使用する必要があります。

最終的にはJava 9で廃止されました。

代わりにsetScale(2, RoundingMode.HALF_EVEN)に電話する必要があります。定義されていないenumを渡すことができないので、エラーチェックがはるかに簡単になりますが、未定義の整数モードを確実に渡すことができます。

+0

Java 9では実際には非推奨*です。 –

+0

@KlitosKyriacou。その情報で更新されました。 –

4

列挙型を「インスタンス化」するのではなく、その定数を使うべきです。あなたは試してみました:あなたはまた、文字列コンストラクタを使用することができることを

new BigDecimal(12.99).setScale(2, RoundingMode.HALF_EVEN); 

注:

new BigDecimal("12.99"); 
+0

はい、それは理想的です。乾杯! – BenjaminJC

2

その他の回答は、丸めモードに関する適切なガイダンスを示しますが、ある程度は別の重要な点がありません。 javadoc

このコンストラクタの結果は、やや予測できません。

全体のポイントは以下のとおりです。あなたは、ダブル値を渡す浮動小数点セマンティクスで蹴るときつまり

:あなたがに特別な、高価な「オーバーヘッド」オブジェクトを使用します任意の浮動小数点数を扱う。しかし、Javaの二重セマンティクスに制限されている値に基づいて開始します。

代わりにnew BigDecimal("12.99")、またはnew BigDecimal(1299, 2)となります。

+1

良い情報ですが、技術的にOPが求めているものではありません。 +1とにかく –

+0

あなたのご意見ありがとうございます。私はOPで提供されたコード例を参考にして、本当の助けになる理由を明確にするために、私の答えを少し書き直しました。 – GhostCat

関連する問題