最近プロジェクトでSonarを使い始めましたが、コンストラクターの使用に関してPMDルールが壊れていましたnew BigDecimal(double val)
。Javaのドキュメントを読んだとき、新しいBigDecimal(double val)はやや予測不可能であり、new BigDecimal(String val)
予測可能なものを使用する必要があることがわかりました。
javadocの説明は次のとおりですBigDecimal
public BigDecimal(double val)
。
doubleをBigDecimalに変換します。これは、doubleの2進浮動小数点値の正確な10進表現です。返されるBigDecimalのスケールは、(10scale×val)が整数になるような最小値です。
ノート:
このコンストラクターの結果は、多少予測できない場合があります。
new BigDecimal(0.1)
Java で書き込むBigDecimal
と、0.1に正確に等しい(スケールなしの値1、スケール1)が作成されると思われるかもしれませんが、実際には0.1000000000000000055511151231257827021181583404541015625に等しくなります。これは、0.1を正確にdoubleとして(または、さらに言えば、任意の有限長の2進数として)表すことができないためです。したがって、コンストラクターに渡される値は、外観にもかかわらず、0.1と正確に等しくはありません。一方、Stringコンストラクターは完全に予測可能です。予想どおり、書き込みにより、0.1に正確に等しい
new BigDecimal("0.1")
aが作成されます。BigDecimal
したがって、一般的には、これよりもStringコンストラクターを使用することをお勧めします。doubleをのソースとして使用する必要がある場合、
BigDecimal
このコンストラクターは正確な変換を提供することに注意してください。Double.toString(double)
メソッドを使用してdoubleをStringに変換してから、BigDecimal(String)
コンストラクターを使用した場合と同じ結果は得られません 。その結果を得るには、静的valueOf(double)
メソッドを使用します。
なぜこのコンストラクターが実際に存在するのですか?new BigDecimal(String val)
そのことについては十分ではありませんか?new BigDecimal(double val)
コンストラクターはいつ使用する必要がありますか?