なぜBigDecimalを(ダブルD)の建設はまだ残っているのですか?
-
20-08-2019 - |
質問
私は(ここでもスタックオーバーフロー上)このコンストラクタの上にかなりの痛みを気づきました。ドキュメントは明確に述べていても、人々はそれを使用します:
このコンストラクタの結果は幾分予測不可能であることができる ます。http://java.sun。 COM /のJava SE / 6 /ドキュメント/ API / Javaの/数学/ BigDecimal.html#のBigDecimal(ダブル)の
私もされて JSR-13 の<のhrefを=見てきました"http://jcp.org/en/jsr/results?id=2758" 勧告は述べての承認のrel = "noreferrer">
我々は現在持つDouble.toString()メソッドとは異なる結果をもたらすのBigDecimal(ダブル)コンストラクタを、卑下提案するの:廃止されるかもしれません。の既存の仕様
このすべてにもかかわらず、コンストラクタはまだ廃止されていません。
私はこの上の任意の意見を聞いてみたい。
解決
非推奨は推奨されません。 APIの一部は例外的な場合にのみ非推奨マークされています。
だから、あなたのビルドプロセスの一部として、FindBugsのを実行します。 FindBugsのは、検出器プラグインAPIを有しており、また、オープンソース(LGPL、IIRC)である。
他のヒント
BigDecimal(double)
の行動を考慮するとのは、私はそれは本当にこのような問題になりすぎてわからないんだけど、私の意見では、正しいです。
私は正確にBigDecimal(double)
コンストラクタのドキュメントの文言に同意しないでしょう。
このコンストラクタの結果は、することができ の多少の予測できません。一つかもしれません Javaが作成中でその書き込み
new BigDecimal(0.1)
を想定 に正確に等しいですBigDecimal
0.1
(1
の規模と1
のスケールなしの値)が、それは実際に等しいです に0.1000000000000000055511151231257827021181583404541015625
ます。
(強調追加)
むしろの予測できないの言うよりも、私は言葉遣いがを予期しないのであるべきであり、そうであっても、これは表現の限界を認識していない人のために予期しない動作になると思います浮動小数点値を10進数します。
限りつの浮動小数点値の精度ですべての小数値を表すことができないことに注意し続けるように、BigDecimal(0.1)
ある0.1000000000000000055511151231257827021181583404541015625
を使用して、返される値は、実際には理にかなっている。
BigDecimal
コンストラクタでインスタンス化さBigDecimal(double)
オブジェクトが一致している場合は、、その後、私は結果が予測可能であることを主張するだろう。
BigDecimal(double)
コンストラクタは廃止されていない理由として、私の推測では、動作が正しいと考えることができているので、そして限り1は、浮動小数点の表現がどのように動作するかを知っているように、コンストラクタの行動はあまりにも驚くべきことではない。
は特定のコンストラクタは、すべての浮動小数点演算のように、近似です。それはただの欠点を持って、本当に壊れていないのです。
ただ、あなたの研究を行う注意して近づき、あなたはどんな驚きを得ることはありません。ダブルス/フロート10進リテラルを割り当てるときは、まったく同じことに遭遇します。