1. ホーム
  2. java

[解決済み] BigDecimal - newまたはvalueOfを使用する。

2022-05-15 09:45:58

質問

double dからBigDecimalオブジェクトを取得する方法を2つ見つけました。

  1. new BigDecimal(d)
  2. BigDecimal.valueOf(d)

どちらが良い方法なのでしょうか?それは valueOf は新しいオブジェクトを作成するのでしょうか?

一般的に(BigDecimalに限らず)、newとvalueOfのどちらが推奨されますか?

どのように解決するのですか?

これらは2つの別々の質問です: "私は何を使用する必要があります。 BigDecimal と、「一般的にはどうすればいいのでしょうか?

について BigDecimal : これは少しやっかいです。 は同じことをするわけではありません。 . BigDecimal.valueOf(double) 正規の String 表現 double のインスタンスを作成するために渡された値です。 BigDecimal オブジェクトのインスタンス化に渡される値です。言い換えれば の値は BigDecimal オブジェクトの値は、あなたが System.out.println(d) .

もしあなたが new BigDecimal(d) を使用すると BigDecimal を表現しようとします。 double をできるだけ正確に表現しようとします。 . これは 通常 を使用すると、必要以上に多くの桁が保存されることになります。厳密に言えば、これは valueOf() よりも正しいですが、直感的にはかなり劣ります。

これについては、JavaDocに素敵な説明があります。

このコンストラクタの結果は、多少予測できないことがあります。ある人は new BigDecimal(0.1) を書くと、Java では BigDecimal を作成します。これは正確に 0.1 (スケールされていない値で、スケールが 1) に等しいのですが、実際には 0.100000000000055511151231257827021181583404541015625 に等しいのです。これは、0.1を正確に表すことができないためです。 double (として表現することができないからです(それどころか、任意の有限長の2進小数としても)。したがって、コンストラクタに渡される値は、見かけによらず 0.1 と正確に等しくはありません。

一般的には が同じであれば (の場合ではない)。 BigDecimal の場合ではなく、他のほとんどの場合)、その場合 valueOf() の方が望ましいと思います: 共通の値をキャッシュすることができます ( Integer.valueOf() で見られるように)、呼び出し元を変更することなくキャッシュの挙動を変更することもできます。 new 常に は、必要でない場合でも、新しい値をインスタンス化します(最良の例です。 new Boolean(true) vs. Boolean.valueOf(true) ).